需求:曲庫表的主鍵錯了,原先設置的是(sang_id),應該設置為(sang_name,singer)聯合主鍵。
-- (0)先備份數據,我這里沒備份
-- (1)進行主鍵的切換之前,要進行一些檢查-- ----- 1)檢查(sang_name,singer)這一對有沒有重復的
SELECT `sang_name`,`singer`,COUNT(*)
FROM `sang_order_sang`
GROUP BY `sang_name`,`singer`
HAVING COUNT(*)>1-- ----- 2)檢查實體完整性約束(主鍵不能為空或部分為空),sang_name有沒有null值、檢查singer有沒有null值
SELECT * FROM `sang_order_sang` WHERE `sang_name`=NULL;
SELECT * FROM `sang_order_sang` WHERE `singer`=NULL;-- (2)因為sang_id是其他表的外鍵,就需要先解除外鍵。其實就是“穿脫原則”-- ----- 1)先查sang_id是哪些表的外鍵,記錄外鍵名
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
FROM information_schema.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'sang_order_sang' AND REFERENCED_COLUMN_NAME = 'sang_id';-- ----- 2)然后一一解除外鍵
ALTER TABLE `sang_order_list` DROP FOREIGN KEY sang_order_list_ibfk_2;-- ----- 3)解除主鍵
-- ----- 這里有個坑,如果主鍵設置了自增,要首先解除自增才能解除主鍵
ALTER TABLE `sang_order_sang` MODIFY `sang_id` BIGINT; -- 解除自增
ALTER TABLE `sang_order_sang` DROP PRIMARY KEY;-- ----- 4)重新設置主鍵
-- ----- 這里有個坑,要重新設置`sang_id`的自增屬性,不然無法匹配外鍵sang_order_list(`sang_id`)的自增屬性
-- ----- 添加 AUTO_INCREMENT時,??必須①同時指定字段的數據類型??,因為自增僅支持整數類型 ②該字段必須是主鍵或者加上了UNIQUE約束
ALTER TABLE `sang_order_sang` ADD UNIQUE(`sang_id`);
ALTER TABLE `sang_order_sang` MODIFY `sang_id` BIGINT UNSIGNED AUTO_INCREMENT;
ALTER TABLE `sang_order_sang` ADD PRIMARY KEY(`sang_name`,`singer`)-- ----- 用descibe或者show create table語句查看主鍵是否建立成功
DESC `sang_order_sang`;
SHOW CREATE TABLE `sang_order_sang`;-- ----- 5)重新設置外鍵
-- ----- 先看一眼,兩個表的sang_id字段類型、長度、符號(如 UNSIGNED)必須完全一致
SHOW CREATE TABLE `sang_order_list`
SHOW CREATE TABLE `sang_order_sang`;
--
ALTER TABLE `sang_order_list` ADD CONSTRAINT sang_order_list_ibfk_2 FOREIGN KEY(`sang_id`) REFERENCES `sang_order_sang`(`sang_id`)