0

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

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;
4

2 回答 2

1

假设您在表中的约束名称twotwo_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

于 2013-07-10T17:26:40.157 回答
0

这直接来自MySQL的 ALTER TABLE文档:

在 MySQL 5.6.7 之前,使用 ALTER TABLE 更改外键列的定义可能会导致引用完整性丢失。例如,将包含 NULL 值的外键列更改为 NOT NULL 会导致 NULL 值成为空字符串。同样,删除父表中的行的 ALTER TABLE IGNORE 可能会破坏参照完整性。

从 5.6.7 开始,服务器禁止更改可能导致失去参照完整性的外键列。一种解决方法是在更改列定义之前使用 ALTER TABLE ... DROP FOREIGN KEY 并在之后使用 ALTER TABLE ... ADD FOREIGN KEY。

这使另一个答案正确。该SET foreign_key_checks=0;语句及其兄弟将禁用约束,但不允许您修改表以使现有约束甚至不再存在。

于 2013-07-10T19:56:56.667 回答