需求:曲库表的主键错了,原先设置的是(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`)