【问题标题】:Error altering primary key column in mysql table更改 mysql 表中的主键列时出错
【发布时间】:2013-06-20 10:10:53
【问题描述】:

我对 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>

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

【问题讨论】:

  • 为什么不直接删除 fk,做你的 alter 语句然后重新创建 fk
  • 你能告诉我怎么做吗?其次,为什么要去掉fk?

标签: mysql sql database


【解决方案1】:

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

show engine innodb status

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

试试这个:

显示 innodb 状态

看这里: Error code 1005, SQL state HY000: Can't create table errno: 150

【讨论】:

    【解决方案2】:

    这样做

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

    尚未准确检查语法,但应该很接近

    【讨论】:

    • 这正是您需要做的。该错误准确地告诉您出了什么问题:您有一个阻止您修改列的外键约束。删除该约束,进行更改,然后重新添加约束。
    • 在执行此操作之前锁定表,以避免数据完整性问题
    【解决方案3】:

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

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

    级联参照完整性

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

    无操作

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

    级联

    引用表中相应的行被更新或删除 当该行在父表中更新或删除时。级联 如果时间戳列是 外键或引用的键。 ON DELETE CASCADE 不能 为具有 INSTEAD OF DELETE 触发器的表指定。在更新 不能为具有 INSTEAD OF 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 动作的组合, 所有 CASCADE、SET NULL 和 SET DEFAULT 操作都在之前应用 数据库引擎检查任何 NO ACTION。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多