mySQL:什么阻止了我的外键约束?

时间:2016-08-03 15:07:20

标签: mysql foreign-keys

我已经尝试了所有我能想到的但是我仍然在创建表格时遇到了问题。

我有一个主键为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)当引用列

上没有合适的索引时
  

在引用的表中找不到引用列作为第一列

的索引

我认为这两个都被覆盖了,这是什么交易?

有人可以发现我的错误吗?

1 个答案:

答案 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?