【问题标题】:Can't add AUTO_INCREMENT on existing column because of foreign key由于外键,无法在现有列上添加 AUTO_INCREMENT
【发布时间】:2015-05-30 14:00:33
【问题描述】:

我有主键列,其中有一些外部外键引用。很平常。我忘了为它添加 AUTO_INCREMENT。现在我执行

ALTER TABLE chat.users CHANGE COLUMN user_id user_id INT(11) NOT NULL AUTO_INCREMENT ;

(PRIMARY KEY 单独定义)

它讲述了一些关于 fk 的信息 ERROR 1833: Cannot change column 'user_id': used in a foreign key constraint 'fk_chats_users' of table 'chat.chats'

我不明白为什么 fk 会打扰它的引用 AUTO_INCREMENT。

【问题讨论】:

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


【解决方案1】:

FK 担心您的更改的原因是因为您试图更改它并用于约束,请记住您可以更改数据类型。

因此,如果您想对 FK 进行更改,请查看this 答案(如果您是在生产环境中进行更改,请记住在之前锁定表)。

【讨论】:

  • 所以 FK 只是阻止任何更改,即使它保留数据类型和所有数据相同?没想到这么粗鲁使用“SET FOREIGN_KEY_CHECKS = 0;”。对我来说非常有帮助。谢谢!
  • 没错,这是确保不违反参照完整性的方法。不客气!
  • "SET FOREIGN_KEY_CHECKS=0" 拯救了我的一天。谢谢。
  • @user3537411 是的。如果我们要更改数据类型或数据长度,我可以同意禁令,但添加和删除 AUTO_INCREMENT 不应破坏与其他表的连接。为什么我们被禁止这样做有点奇怪。
【解决方案2】:

(PRIMARY KEY 单独定义)

如果您在列上定义了主键,那么我认为没有必要修改您的列并为其添加 auto_increment。主键默认自动递增。

但是,如果您想在其上设置 auto_increment 功能,请尝试如下:

--Drop foreign key
ALTER TABLE chat.users DROP FOREIGN KEY fk_chats_users;
--Alter your primary key
ALTER TABLE person modify user_id INT(11) not null auto_increment;
--Recreate foreign key
ALTER TABLE chat.users ADD CONSTRAINT fk_chats_users FOREIGN KEY (user_id) REFERENCES chat.users(user_id) ON DELETE CASCADE;

【讨论】:

  • 主键默认自动递增?我看不到它。如果我没有明确的 AUTO_INCREMENT,那么在“插入用户(用户名)值(“me”)”之后,我希望 user_id 增量生成,它告诉我“错误代码:1364。字段 'user_id' 没有默认值“。
  • 如果我明确添加 0 作为默认值,它会在第二次尝试后告诉我“错误代码:1062。重复条目 '0' for key 'PRIMARY'”。
  • SHOW CREATE TABLE 用于每个相关表。没有它,我们只是在猜测。
猜你喜欢
  • 2015-03-09
  • 2014-09-14
  • 2014-01-15
  • 1970-01-01
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2011-06-28
相关资源
最近更新 更多