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

21 浏览
0 Comments

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)当引用列上没有适当的索引时

在引用的表中找不到索引,其中引用的列作为第一列出现

我认为这两个都涵盖了,那么问题在哪里呢?

有人能发现我的错误吗?

admin 更改状态以发布 2023年5月21日
0
0 Comments

也许您的用户名列具有不同的字符集,您可以尝试这样做:

ALTER TABLE sessions MODIFY username VARCHAR(50) CHARACTER SET utf8; 
ALTER TABLE users MODIFY username VARCHAR(50) CHARACTER SET utf8;

根据 @Graeme Stuart 的建议,这是一个链接,可以查看数据库/表格或列的字符集: 如何查看 MySQL 数据库/表格/列的字符集?

0