错误
Error on rename of … errno: 150 – Foreign key constraint is incorrectly formed)
因为您尝试删除引用的主键,即使您使用SET FOREIGN_KEY_CHECKS = 0禁用外键约束检查,也会发生这种情况;
禁用外键检查将允许您临时删除货币表中的行或在外键表中添加无效的currencyId,但不能删除主键.
更改已被其他表引用的PRIMARY KEY并不简单,因为您可能会丢失表之间的参照完整性并丢失数据之间的关系.为了保留数据,您需要一个过程,例如:
>向每个FK表添加新的外键列(代码)
>通过更新映射上一个currencyId中的代码外键
>删除现有的外键
>删除旧的currencyId外键列
>删除所有FK后,更改货币表上的主键
>根据新代码列重新建立外键
下面这样做而不需要禁用FOREIGN_KEY_CHECKS,但是对于引用货币的所有表,需要重复外键映射/删除/重新创建步骤:
-- Add new FK column
ALTER TABLE FKTable ADD currencyCode char(3)
CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL;
-- Map FK column to the new Primary Key
UPDATE FKTable
SET currencyCode = (SELECT `code` FROM currency WHERE id = FKTable.currencyId);
-- Drop the old foreign key + column
ALTER TABLE FKTable DROP FOREIGN KEY FKTable_Currency;
ALTER TABLE FKTable DROP COLUMN currencyId;
-- Once the above is done for all FK tables, drop the PK on currency
ALTER TABLE `currency` CHANGE COLUMN `id` `id` INT(11) NOT NULL,
DROP PRIMARY KEY;
ALTER TABLE currency ADD PRIMARY KEY (`code`);
ALTER TABLE FKTable ADD CONSTRAINT FKTable_Currency2
FOREIGN KEY (currencyCode) REFERENCES currency(`code`);