1. 程式人生 > 其它 >將一個庫的主鍵複製到另一個庫上相同表上 Multiple primary key defined

將一個庫的主鍵複製到另一個庫上相同表上 Multiple primary key defined

技術標籤:mysql

給表加主鍵
alter table zy_onestop_db.表名add primary key(欄位名)

將第一個庫的主鍵複製到第二個庫

這裡第一個表:zy_onestop_produce 第二個表 :zy_onestop_db

查詢第一個庫表主鍵

select TABLE_NAME,COLUMN_NAME from  information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_produce' and COLUMN_KEY = 'PRI' 

定義遊標獲取表名和欄位名

-- 定義遊標遍歷變數
 DECLARE s int DEFAULT 169;
 DECLARE c_name varchar(255);
 DECLARE c_id varchar(255);
 -- 儲存資料表建立語句
 DECLARE sql1Str VARCHAR(500);
 -- 定義遊標,並將sql結果集賦值到遊標中
 DECLARE report CURSOR FOR select TABLE_NAME,COLUMN_NAME from information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_produce' and COLUMN_KEY = 'PRI'

在迴圈寫業務

-- 聲明當遊標遍歷完後將標誌變數置成某個值
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET s=1;
		-- 開啟遊標
	open report;
		-- 將遊標中的值賦值給變數,注意:變數名不要和返回的列名同名,變數順序要和sql結果列的順序一致
		fetch report into c_name,c_id;
		while s<>1 do
			
		end while;
		-- 關閉遊標
	  close report;

在迴圈體寫上邏輯

SET @sql1Str= CONCAT('alter table zy_onestop_db.',c_name,' add primary key(',c_id,');');

prepare s1 from @sql1Str;
   execute s1;
   deallocate prepare s1;

-- 將遊標中的值再賦值給變數,供下次迴圈使用
   fetch report into c_name,c_id;
  -- 當s等於1時表明遍歷以完成,退出迴圈
  set s = s-1;

最後執行

call primarykeys;

執行時報下面圖片的錯

這是由於第二個表上存在主鍵,就會報定義了多個主鍵

select * from information_schema.`COLUMNS` where TABLE_SCHEMA = 'zy_onestop_db' and COLUMN_KEY = 'PRI' 

查詢一下第二個表果然如此

把第二個表主鍵刪除再call primarykeys; 不會報錯了