errno 150:外键约束格式错误

Spe*_*rds 3 mysql mariadb

我已经读过很多关于此错误的问题,或者我不明白发生了什么/答案,或者它不适合我的情况。

我已经有一个简单的用户表:

CREATE TABLE user
(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(64) NOT NULL
);
CREATE UNIQUE INDEX user_username_uindex ON user (username);
Run Code Online (Sandbox Code Playgroud)

我想添加一个引用用户ID的帖子表:

CREATE TABLE post
(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    date DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    authorID INT NOT NULL,
    imgPath VARCHAR(500),
    postText TEXT NOT NULL,
    CONSTRAINT post_user_id_fk FOREIGN KEY (authorID) REFERENCES user (id) ON DELETE SET NULL
);
Run Code Online (Sandbox Code Playgroud)

但是不会创建第二个表,而是抛出标题中提到的错误:

“外键约束的格式不正确”。

我尝试了其他问题的答案中提到的一些事情(我可能会误解了),例如使user.id唯一性也起作用,尽管那是行不通的。

有人可以帮我解决问题吗?我有更复杂的数据库使用此方法,并且以前从未抛出过错误。

小智 15

在当前情况下,authorID NOT NULL 是问题所在,但有时不容易指出导致错误的原因。有一种简单的方法可以找到导致此错误的原因,您可以使用:SHOW ENGINE INNODB STATUS;

这将在“最新外键错误”部分下显示有关错误的更多详细信息。

更多细节在这里:

https://mariadb.org/mariadb-innodb-foreign-key-constraint-errors/


Luk*_*zda 5

您需要删除NOT NULLauthorID

CREATE TABLE post
(
    id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    date DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
    authorID INT ,   -- here NOT NULL was removed
    imgPath VARCHAR(500),
    postText TEXT NOT NULL,
    CONSTRAINT post_user_id_fk FOREIGN KEY (authorID) 
     REFERENCES user (id)  ON DELETE SET NULL
);
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示

ON DELETE SET NULLNOT NULL列不兼容。

  • 啊对。简直不敢错过!非常感谢你! (2认同)