我在MySQL中创建了3个表(Users,linkPosts,replyPosts)
前两个表执行正常,但是当我尝试插入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)
我搜索并尝试过其他人的解决方案,但从未奏效。任何人都可以找出错误的位置?
提前致谢..
答案 0 :(得分:1)
表 replyPosts 是否已存在?如果您有重复的外键名称,则可能发生此错误。使用perror和错误(在您的情况下,错误150),您应该得到:
MySQL error code 150: Foreign key constraint is incorrectly formed
在查看完整的SQL之后,我认为在创建 LinkPosts 表时 linkPostID为INT UNSIGNED 这一事实,而在 ReplyPosts < / strong> table, linkPostID是INT 。将其更改为 INT UNSIGNED ,看看它是否有效。
根据此处的文档"foreign keys"应该具有相同的大小和符号,如果它是整数。
作为旁注,我仍然坚持在User表而不是UserName上使用UserId作为主键。每次在Users表中插入记录时,它都将按UserName排序(因为它是主键,因此是聚簇索引)。 UserName字段(Varchar(20))越大,对整个表进行排序所需的时间越长。随着表的增长,将记录插入User表会变得很麻烦。
答案 1 :(得分:0)
这是由于外键约束
因为您正在使用FOREIGN KEY (userName) REFERENCES Users(userName)
这是一个varchar,在MYSQL中不可能在varchar
您可以删除userName的外键约束,并尝试使用userId