【问题标题】:MySQL add Foreign KeyMySQL 添加外键
【发布时间】:2014-09-11 05:08:01
【问题描述】:

我想更新一个当前是普通 INT(16) 的列,以便它引用另一个表上的 FK。我尝试了以下方法,但出现错误:

ALTER TABLE ts_keys ADD CONSTRAINT FK_account_id FOREIGN KEY (account_id) REFERENCES accounts(id) ON UPDATE CASCADE ON DELETE CASCADE

编辑:对不起,忘记添加错误:

Can't create table (errno: 150)

两个表都是 Innodb。

编辑 2:我也尝试重新创建表,但同样的错误:

    CREATE TABLE ts_keys (
  id int PRIMARY KEY AUTO_INCREMENT,
  account_id int,
  FOREIGN KEY fk_account_id1(account_id) REFERENCES accounts(id)
) ENGINE=InnoDB;

【问题讨论】:

  • 您遇到错误了吗?什么错误?
  • 第一个只是语法错误,查看MySQL手册。 MODIFY columnname 后面必须跟列定义,而不是外键定义。对于第二个错误,这里还有许多其他问题可以解释导致错误 150 的原因。有许多可能的原因,而您没有提供足够的信息来知道它是什么。所以请搜索一下。

标签: mysql key


【解决方案1】:

外键列的数据类型必须与完全被引用列的数据类型匹配。

执行SHOW CREATE TABLE accounts 并查看id 列的定义。

无论该列定义为INT UNSIGNEDBIGINTVARCHAR(16),无论是什么,

您要定义为外键的列(ts_keys 表中的account_id 列)必须与该数据类型匹配完全。 (只是必须匹配的数据类型。列注释不必匹配,DEFAULT 值不必匹配,NULL/NOT NULL 不必匹配。但要求数据类型匹配。


您添加约束的语法看起来是正确的:

ALTER TABLE ts_keys
  ADD CONSTRAINT FK_account_id 
  FOREIGN KEY (account_id) 
  REFERENCES accounts(id) 
  ON UPDATE CASCADE ON DELETE CASCADE

诚然,“无法创建表 (errno: 150)”对于实际导致问题的原因而言,必须是最不有用的消息。 (至少错误不是“检查手册”语法错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2020-08-27
    • 2017-05-10
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多