mySQL:什么阻止了我的外键约束?
mySQL:什么阻止了我的外键约束?
我想到了所有我所能想到的办法,但创建表仍然遇到问题。
我有一个带有主键 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
通常来说,我发现这个错误是由于主/外键数据类型不匹配引起的,但这一次它们都明确地是varchar(50)
,所以问题显然不在这里。
我还试过了下面这个:
CREATE TABLE sessions (
created_at DATETIME,
updated_at DATETIME,
token VARCHAR(50) NOT NULL,
username varchar(50) NOT NULL, #<- ***增加了非空约束***
PRIMARY KEY (token),
FOREIGN KEY(username) REFERENCES users (username)
);
mysql>SHOW ENGINE INNODB STATUS
最近的外键错误
2016年8月3日15:13:23 a46fcb70 发生于savesdev / sessions表的外键约束错误:
FOREIGN KEY(username) REFERENCES users (username)):
在关联表中找不到索引,其引用的列作为第一列出现,或列类型
表中的列与引用表中的列不匹配,用于约束。
请注意,ENUM和SET的内部存储类型已经发生变化
使用> = InnoDB-4.1.12创建的表,旧表中的此类列
不能被新表中的此类列引用。
请参阅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 数据库/表格/列的字符集?