为啥 MySQL 不允许这个外键? [复制]
Posted
技术标签:
【中文标题】为啥 MySQL 不允许这个外键? [复制]【英文标题】:Why does MySQL not allow this foreign key? [duplicate]为什么 MySQL 不允许这个外键? [复制] 【发布时间】:2013-07-10 23:06:07 【问题描述】:我正在使用 mysql 5 来尝试创建两个表。这是两张表:
DROP TABLE IF EXISTS `users` ;
CREATE TABLE IF NOT EXISTS `users` (
`username` VARCHAR(50) not null ,
`password` VARCHAR(50) not null,
`enabled` boolean not null,
`accountNonExpired` boolean not null,
`accountNonLocked` boolean not null,
`credentialsNonExpired` boolean not null,
PRIMARY KEY (`username`)
) ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
DROP TABLE IF EXISTS `authorities` ;
create table IF NOT EXISTS `authorities` (
`username` VARCHAR(50) not null ,
`authority` varchar(50) not null,
foreign key (`username`) references `users` (`username`),
unique index authorities_idx_1 (username, authority)
) engine = InnoDb;
当我尝试执行此语句时,创建了 users 表,但随后出现错误:
Error Code: 1005
Can't create table 'dental.authorities' (errno: 150)
当两个引用的列相同时,我不明白为什么这个外键会失败。有没有
【问题讨论】:
这对我来说成功构建:sqlfiddle.com/#!2/1e9acf 并且看起来不错。您使用的是什么 MySQL 版本? (只要先创建users
)
你为什么使用 varchar 外键而不是 if?使用 varchar 字段作为主键是个坏主意
你查过类似问题的cmets吗:***.com/questions/1457305/…
@demonofnight:varchar 主键本质上没有什么“错误”。或使用小数、字符、浮点数、日期或时间戳主键。
【参考方案1】:
外键要求两个键具有相同的字符集。 添加
DEFAULT CHARACTER SET = utf8;
到你的第二个表 CREATE 指令。
编辑:天哪,看来我参加派对要迟到了。
【讨论】:
谢谢 benfranke,我以为只有列数据类型必须匹配。【参考方案2】:检查以下几点:
我认为DEFAULT CHARACTER SET = utf8;
没有提供给第二张桌子
1. The two tables must be ENGINE=InnoDB. (can be others: ENGINE=MyISAM
works too)
2. The two tables must have the same charset.
3. The PK column(s) in the parent table and the FK column(s) must be
the same data type.
4. The PK column(s) in the parent table and the FK column(s), if they
have a define collation type, must have the same collation type;
5. If there is data already in the foreign key table, the FK column
value(s) must match values in the parent table PK columns.
6. And the child table cannot be a temporary table.
希望这会有所帮助。
【讨论】:
"可以是其他人:ENGINE=MyISAM 也可以" 【参考方案3】:根据您的服务器版本和设置,您可能需要添加
DEFAULT CHARACTER SET = utf8
到“authorities”的 CREATE TABLE 语句。这将匹配被引用表的字符集。
【讨论】:
以上是关于为啥 MySQL 不允许这个外键? [复制]的主要内容,如果未能解决你的问题,请参考以下文章