將一個庫的主鍵複製到另一個庫上相同表上 Multiple primary key defined
阿新 • • 發佈:2020-12-21
技術標籤: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; 不會報錯了