2014-09-11 74 views
0

我想更新一个当前是纯INT(16)的列,以便它引用另一个表上的FK。我试过以下,但有错误:MySQL添加外键

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

你有错误吗?什么错误? – Barmar 2014-09-11 05:14:27

+0

第一个只是语法不正确,请检查MySQL手册。 'MODIFY columnname'后面必须有列定义,而不是外键定义。对于第二个错误,这里还有很多其他问题可以解释导致错误150的原因。有许多可能的原因,并且您没有提供足够的信息来了解它是什么。所以做一个搜索。 – Barmar 2014-09-11 05:22:36

回答

1

外键列的数据类型必须与所引用列的数据类型匹配EXACTLY

做一个SHOW CREATE TABLE accounts并看看id列的定义。

无论该列被定义为INT UNSIGNEDBIGINTVARCHAR(16),不管,

要定义为外键(在ts_keys表中的列account_id)列必须在数据类型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)”必须是关于什么是真正的至少有用信息造成问题(至少错误不是“检查手册”的语法错误。)

+0

耶加入“未签名”修复了问题:)谢谢! – Chris 2014-09-11 05:49:13