[英]mySQL: What is preventing my foreign key constraint?
我已经尝试了所有我能想到的但是我仍然在创建表格时遇到问题。
我有一个带有主键username
的用户表
+---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | created_at | datetime | YES | | NULL | | | updated_at | datetime | YES | | NULL | | | username | varchar(50) | NO | PRI | NULL | | | administrator | tinyint(1) | YES | | NULL | | | fullname | text | YES | | NULL | | | description | text | YES | | NULL | | | password | varchar(60) | NO | | NULL | | +---------------+-------------+------+-----+---------+-------+
我想创建一个像这样的新表:
CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username VARCHAR(50), PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );
但我得到一个令人讨厌的错误:
ERROR 1215 (HY000): Cannot add foreign key constraint
我经常发现这个错误是由pk / fk对的数据类型不匹配引起的,但这次两者都显然是varchar(50)
所以看起来问题出在其他地方。
我也试过这个以防万一:
CREATE TABLE sessions ( created_at DATETIME, updated_at DATETIME, token VARCHAR(50) NOT NULL, username varchar(50) NOT NULL, #<- ***added not null*** PRIMARY KEY (token), FOREIGN KEY(username) REFERENCES users (username) );
mysql>SHOW ENGINE INNODB STATUS
最新的外国关键错误
2016-08-03 15:13:23 a46fcb70表savedev / sessions的外键约束出错:FOREIGN KEY(用户名)REFERENCES用户(用户名)):在引用的表中找不到引用列作为第一个出现的索引表中的列或列类型与引用的表不匹配约束。 请注意,使用> = InnoDB-4.1.12创建的表中ENUM和SET的内部存储类型已更改,旧表中的此类列不能被新表中的此类列引用。 有关正确的外键定义,请参见http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html 。
看来错误是在两种情况下引起的:
1)当存在不匹配时(我已排除)
表中的列类型和引用的表与约束不匹配。
2)当引用列上没有合适的索引时
在引用的表中找不到索引,其中引用的列显示为第一列
我认为这两个都被覆盖了,那么这笔交易是什么?
谁能发现我的错误?
也许你的列用户名有不同的字符集你可以试试这个:
ALTER TABLE sessions MODIFY username VARCHAR(50) CHARACTER SET utf8;
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8;
正如@Graeme Stuart所建议的,这是一个链接,可以看到我们如何检查数据库/表或列的租用者集: 如何查看MySQL数据库/表/列的字符集是什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.