我是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>
我确信它很简单,但我无法弄清楚为什么和我所关注的书并没有说明原因。感谢。
答案 0 :(得分: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;
没有完全检查语法,但应该关闭
答案 1 :(得分:1)
再次执行SQL然后运行
show engine innodb status
在MySQL命令提示符下键入以上命令。它应该可以帮助您更多地了解SQL无法执行的原因。
请尝试这样做:
显示innodb状态
看看这里: Error code 1005, SQL state HY000: Can't create table errno: 150
答案 2 :(得分:0)
您无法更改主键,因为它在其他表中被引用为外键。这是因为引用完整性约束。
参照完整性虽然外键约束的主要目的是控制可以存储在国外的数据 密钥表还控制主键表中数据的更改。约束通过保证如果这些更改使外键表中的数据链接无效,则无法对主键表中的数据进行更改,从而强制实现参照完整性。如果尝试删除主键表中的行或更改主键值,则当删除或更改的主键值对应于另一个表的外键约束中的值时,操作将失败。要成功更改或删除外键约束中的行,必须先删除外键表中的外键数据,或更改外键表中的外键数据,该外键将外键链接到不同的主键数据。
级联参照完整性
通过使用级联参照完整性约束,您可以定义 用户尝试删除时数据库引擎执行的操作 或更新现有外键指向的键。下列 可以定义级联动作。
无行动
数据库引擎会引发错误并执行删除或更新操作 回滚父表中的行。
<强> CASCADE 强>
在引用表中更新或删除相应的行 在父表中更新或删除该行时。级联 如果时间戳列是其中一部分,则无法指定 外键或引用的键。 ON DELETE CASCADE不能 为具有INSTEAD OF DELETE触发器的表指定。 ON UPDATE 无法为具有INSTEAD OF UPDATE的表指定CASCADE 触发器。
SET NULL
组成外键的所有值都设置为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动作的组合, 之前应用了所有CASCADE,SET NULL和SET DEFAULT操作 数据库引擎检查是否有任何操作。