为什么这个外键约束不起作用?

时间:2016-04-03 03:17:30

标签: mysql foreign-keys

我正在创建一个与现有表有关系的新表。新表有一列user_id,它引用另一个表上的userid列(users表中用户的ID)。

我有下表:

CREATE TABLE `ads` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  -- Other columns...
)
  DEFAULT CHARACTER SET utf8
  COLLATE utf8_unicode_ci
  ENGINE = InnoDB;

添加引用列

ALTER TABLE `ads` ADD `user_id` INT(11) NOT NULL

参考以下专栏

CREATE TABLE users
(
  userid INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
-- Other irrelevant fields...
);

最后我的关键定义是:

ALTER TABLE `ads` ADD CONSTRAINT ads_user_id_foreign FOREIGN KEY (`user_id`) REFERENCES `users` (`userid`)

但由于某种原因,我仍然会收到错误:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `ads` add constraint ads_user_id_foreign foreign key (`user_id`) references `users` (`userid`))

注意: 我不相信它的相关性,但我使用Laravel的查询构建器来创建新表。我从PHPStorm的复制DDL 功能中获取这些查询,以向您展示等效的" vanilla MySQL查询"。

1 个答案:

答案 0 :(得分:1)

好的,所以我明白了。就我而言,我还需要更改users表的引擎,字符集和排序规则。 IT分别设置为MyISAMlatin1latin1_swedish_ci

我说我使用的是Laravel,所以这里是我用来解决这个问题的陈述:

DB::statement('ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci');
DB::statement('ALTER TABLE users ENGINE=InnoDB;');

我会尝试在将来为这些帖子留下一个通用的答案。

外键不工作时要检查的事项:

1。确保列设置相同

我使用IDE(PHPStorm),它允许我从现有表中获取一些DDL。我将其粘贴到某处,找到有问题的列,看看它们是否正确定义。

2。检查表状态是否存在不一致

您可以使用SHOW TABLE STATUS检查所有表的状态。你会得到一个看起来像这样的结果(显然这取决于你的IDE):

enter image description here

确保enginecollation在两个表中匹配

•如果您发现engine错误(应该是 InnoDB ),您可以使用

进行修复
ALTER TABLE <table_name> ENGINE=InnoDB;

•如果您发现collation错误,可以使用

进行修复
alter table <table_name> convert to character set <CHARSET> collate <COLLATION>;

(其中字符集可能为utf8,排序规则可能为utf8_unicode_ci