3

我对 SQL 和 MySQL 很陌生。我正在尝试修改表中的主键列,使其自动递增。这个主键也是另一个表中的外键。由于与另一个表中的外键相关的错误,我无法修改此列。这是错误:

mysql> desc favourite_food;
+-----------+----------------------+------+-----+---------+-------+
| Field     | Type                 | Null | Key | Default | Extra |
+-----------+----------------------+------+-----+---------+-------+
| person_id | smallint(5) unsigned | NO   | PRI | 0       |       |
| food      | varchar(20)          | NO   | PRI |         |       |
+-----------+----------------------+------+-----+---------+-------+
2 rows in set (0.09 sec)

mysql> alter table person modify person_id smallint unsigned auto_increment;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    22
Current database: bank

ERROR 1833 (HY000): Cannot change column 'person_id': used in a foreign key cons
traint 'fk_fav_food_person_id' of table 'bank.favourite_food'
mysql>

我确信这很简单,但我不知道为什么,而且我正在关注的书没有说明原因。谢谢。

4

3 回答 3

4

做这样的事情

--Drop fk
ALTER TABLE favourite_food DROP FOREIGN KEY fk_fav_food_person_id;
--Alter your pk
ALTER TABLE person modify person_id smallint unsigned auto_increment;
--Recreate fk
ALTER TABLE favourite_food ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id) ON DELETE CASCADE;

没有准确检查语法,但应该很接近

于 2013-06-24T00:43:41.363 回答
1

再次执行您的 SQL,然后运行

show engine innodb status

在 MySQL 命令提示符下键入上述命令。它应该可以帮助您了解有关 SQL 无法执行的原因的更多信息。

否则试试这个:

显示 innodb 状态

看这里: 错误代码1005,SQL状态HY000:无法创建表errno:150

于 2013-06-24T00:20:28.523 回答
0

您不能更改主键,因为它在其他表中被引用为外键。这是因为参照完整性约束。

参照完整性虽然外键约束的主要目的是控制可以存储在外键表中的数据,但它也控制对主键表中数据的更改。约束通过保证不能对数据进行更改来强制引用完整性如果这些更改使指向外键表中数据的链接无效,则在主键表中。如果尝试删除主键表中的行或更改主键值,则当删除或更改的主键值对应于另一个表的外键约束中的值时,操作将失败。要成功更改或删除外键约束中的一行,您必须首先删除外键表中的外键数据或更改外键表中的外键数据,

级联参照完整性

通过使用级联引用完整性约束,您可以定义数据库引擎在用户尝试删除或更新现有外键指向的键时执行的操作。可以定义以下级联操作。

无动作

数据库引擎引发错误,并且对父表中的行执行的删除或更新操作被回滚。

级联

当父表中的行被更新或删除时,相应的行在引用表中被更新或删除。如果时间戳列是外键或引用键的一部分,则不能指定 CASCADE。不能为具有 INSTEAD OF DELETE 触发器的表指定 ON DELETE CASCADE。不能为具有 INSTEAD OF UPDATE 触发器的表指定 ON UPDATE CASCADE。

设置为空

当父表中的相应行被更新或删除时,构成外键的所有值都设置为 NULL。要执行此约束,外键列必须可以为空。不能为具有 INSTEAD OF UPDATE 触发器的表指定。

默认设置

如果父表中的相应行被更新或删除,则构成外键的所有值都设置为其默认值。要执行此约束,所有外键列都必须具有默认定义。如果列可以为空,并且没有设置显式默认值,则 NULL 将成为该列的隐式默认值。不能为具有 INSTEAD OF UPDATE 触发器的表指定。

CASCADE、SET NULL、SET DEFAULT 和 NO ACTION 可以组合在相互具有引用关系的表上。如果数据库引擎遇到 NO ACTION,它会停止并回滚相关的 CASCADE、SET NULL 和 SET DEFAULT 操作。当 DELETE 语句导致 CASCADE、SET NULL、SET DEFAULT 和 NO ACTION 操作的组合时,在数据库引擎检查任何 NO ACTION 之前应用所有 CASCADE、SET NULL 和 SET DEFAULT 操作。

于 2013-06-24T00:44:20.710 回答