我想更新一个当前是普通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;
答案 0 :(得分:1)
外键列的数据类型必须与完全引用列的数据类型匹配。
执行SHOW CREATE TABLE accounts
并查看id
列的定义。
无论该列被定义为INT UNSIGNED
,BIGINT
,VARCHAR(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)"必须是关于实际导致问题的最少有用的消息。 (至少错误不是"检查手册"语法错误。