以下是我目前的数据库结构
CREATE TABLE one (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id));
CREATE TABLE two (
id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
one_id MEDIUMINT UNSIGNED NOT NULL
PRIMARY KEY (id),
CONSTRAINT FOREIGN KEY (`one_Id`) REFERENCES `one` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);
如何在两个表
上运行以下alter命令ALTER TABLE one MODIFY COLUMN `id` int(10) NOT NULL auto_increment;
ALTER TABLE two MODIFY COLUMN `one_id` int(10) NOT NULL;
现在我收到此错误
ERROR 1025 (HY000): Error on rename (errno: 150)
我也试过禁用这些但是没有帮助
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
答案 0 :(得分:1)
假设表two
中的约束名称为two_ibfk_1
,您可以使用此命令查看约束的名称:
SHOW CREATE TABLE two
;
所以命令首先删除约束,然后在修改后重新创建
ALTER TABLE two DROP FOREIGN KEY two_ibfk_1;
ALTER TABLE one MODIFY COLUMN `id` int(10) NOT NULL auto_increment;
ALTER TABLE two MODIFY COLUMN `one_id` int(10) NOT NULL ;
ALTER TABLE two ADD CONSTRAINT FOREIGN KEY (`one_Id`) REFERENCES `one` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
仅供参考,修改表two
的第二个命令不能设置为auto_increment,因为主要是列id
答案 1 :(得分:0)
这直接来自MySQL的a ALTER TABLE文档:
在MySQL 5.6.7之前,使用ALTER TABLE来更改a的定义 外键列可能会导致参照完整性丢失。对于 例如,将包含NULL值的外键列更改为 be NOT NULL导致NULL值为空字符串。同样的, 删除父表中的行的ALTER TABLE IGNORE可能会中断 参照完整性。
从5.6.7开始,服务器禁止更改外键列 可能导致参照完整性丧失。解决方法是 在更改列之前使用ALTER TABLE ... DROP FOREIGN KEY 定义和ALTER TABLE ...之后添加FOREIGN KEY。
这使得另一个答案正确。 SET foreign_key_checks=0;
语句及其兄弟会禁用约束,但不允许您修改表,以便现有约束不再存在。