我已经尝试了所有我能想到的但是我仍然在创建表格时遇到了问题。
我有一个主键为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用户(用户名)): 在引用的表中找不到索引 引用的列显示为第一列或列类型 在表中,引用的表与约束不匹配。 请注意,ENUM和SET的内部存储类型已更改 使用&gt; = InnoDB-4.1.12创建的表,以及旧表中的此类列 新表中的此类列不能引用它们。 见http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html 正确的外键定义。
在两种情况下似乎提出错误:
1)当出现不匹配时(我已排除)
表中的列类型和引用的表与约束不匹配。
2)当引用列
上没有合适的索引时在引用的表中找不到引用列作为第一列
的索引
我认为这两个都被覆盖了,这是什么交易?
有人可以发现我的错误吗?
答案 0 :(得分:6)
也许你的列用户名有不同的字符集你可以试试这个:
ALTER TABLE sessions MODIFY username VARCHAR(50) CHARACTER SET utf8;
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8;
正如@Graeme Stuart所建议的,这是一个链接,可以看到我们如何检查数据库/表格或列的租船人集合:How do I see what character set a MySQL database / table / column is?