MySQL添加外键

时间:2014-09-11 05:08:01

标签: mysql key

我想更新一个当前是普通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;

1 个答案:

答案 0 :(得分:1)

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

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

无论该列被定义为INT UNSIGNEDBIGINTVARCHAR(16),无论如何,

要定义为外键的列(account_id表中的ts_keys列)必须与该数据类型 EXACTLY 匹配。 (它只是必须匹配的数据类型。列注释不必匹配,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

不可否认,"无法创建表(错误号:150)"必须是关于实际导致问题的最少有用的消息。 (至少错误不是"检查手册"语法错误。