mysql innodb改变了两个有外键的表

时间:2013-07-10 17:02:25

标签: mysql foreign-keys foreign-key-relationship

以下是我目前的数据库结构

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;

2 个答案:

答案 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;语句及其兄弟会禁用约束,但不允许您修改表,以便现有约束不再存在。