我正在创建一个与现有表有关系的新表。新表有一列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查询"。
答案 0 :(得分:1)
好的,所以我明白了。就我而言,我还需要更改users
表的引擎,字符集和排序规则。 IT分别设置为MyISAM
,latin1
和latin1_swedish_ci
。
我说我使用的是Laravel,所以这里是我用来解决这个问题的陈述:
DB::statement('ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci');
DB::statement('ALTER TABLE users ENGINE=InnoDB;');
我会尝试在将来为这些帖子留下一个通用的答案。
我使用IDE(PHPStorm),它允许我从现有表中获取一些DDL。我将其粘贴到某处,找到有问题的列,看看它们是否正确定义。
您可以使用SHOW TABLE STATUS
检查所有表的状态。你会得到一个看起来像这样的结果(显然这取决于你的IDE):
确保engine
和collation
在两个表中匹配
•如果您发现engine
错误(应该是 InnoDB ),您可以使用
ALTER TABLE <table_name> ENGINE=InnoDB;
•如果您发现collation
错误,可以使用
alter table <table_name> convert to character set <CHARSET> collate <COLLATION>;
(其中字符集可能为utf8
,排序规则可能为utf8_unicode_ci
)