0

我在 MySQL 中创建 3 个表(用户、链接帖子、回复帖子)

前两个表执行得很好,但是当我尝试插入replyPosts 的SQL 时出现错误。以下是三张表的SQL代码:

第一个表 SQL 代码:工作正常

CREATE TABLE Users ( 
userName VARCHAR (20) NOT NULL PRIMARY KEY,
password VARCHAR (20),
firstName VARCHAR (200),
lastName VARCHAR (200),
bio VARCHAR (160),
email VARCHAR (200),
country VARCHAR (200)
); 

第二张表的代码:工作正常

CREATE TABLE linkPosts ( 
linkPostID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
link VARCHAR(255),
linkDescription VARCHAR (140), 
linkPostTime TIMESTAMP,
userName VARCHAR (20),
FOREIGN KEY (userName) REFERENCES Users(userName));

出现错误的第三个表:

CREATE TABLE replyPosts ( 
replyPostID INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
reply VARCHAR (140), 
replyPostTime TIMESTAMP,
userName VARCHAR (20),
linkPostID INT,
FOREIGN KEY (linkPostID) REFERENCES linkPosts(linkPostID),
FOREIGN KEY (userName) REFERENCES Users(userName));

我得到的错误如下:

Error 1005 : Can't create table 'mdb_aa847.replyPosts' (errno: 150)

我搜索并尝试了其他人的解决方案,但从未奏效。任何人都可以弄清楚错误在哪里?

提前致谢..

4

2 回答 2

1

replyPosts是否已经存在?如果您有重复的外键名称,则可能会发生此错误。将perrorerrno一起使用(在您的情况下,它的错误 150),您应该得到:

MySQL error code 150: Foreign key constraint is incorrectly formed

在查看了完整的 SQL 之后,我认为这取决于创建LinkPosts表时linkPostID 是 INT UNSIGNED的事实,而在ReplyPosts表中,linkPostID 是 INT。将其更改为INT UNSIGNED并查看它是否有效。

根据此处的文档,“外键”应该具有相同的大小和符号,如果它是整数的话。

作为旁注,我仍然坚持使用 UserId 作为用户表上的主键,而不是 UserName。每次在用户表中插入一条记录时,它都会按用户名排序(因为它是主键,因此是聚集索引)。UserName 字段 (Varchar(20)) 越大,对整个表进行排序所需的时间就越长。随着表的增长,将记录插入用户表会变得很麻烦。

于 2012-11-29T11:50:41.007 回答
0

这是由于外键约束

并且由于您使用FOREIGN KEY (userName) REFERENCES Users(userName) 的是varchar,因此在MYSQL中不可能在varchar

您可以删除 userName 的外键约束,并尝试使用 userId

于 2012-11-29T11:42:22.853 回答