errno 150:外键约束形成错误

时间:2018-03-11 13:49:08

标签: 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);

我想添加一个引用用户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
);

然而,第二个表格没有被创建,而是抛出了标题中提到的错误:

  

"外键约束形成错误"。

我尝试了一些其他问题'答案已经提到(我可能误解了),例如使user.id也是唯一的,尽管这不起作用。

有人可以帮我解决问题所在。我有更复杂的数据库使用这种方法,它之前从未抛出错误。

2 个答案:

答案 0 :(得分:6)

在当前情况下,authorID NOT NULL是问题所在,但有时指出错误的原因并不容易。有一种简单的方法可以找到导致此错误的原因,您可以使用: 显示引擎的INNODB状态; <​​/ p>

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

更多详细信息在这里:

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

答案 1 :(得分:4)

您需要从NOT NULL移除authorID

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
);

<强> DBFiddle Demo

ON DELETE SET NULLNOT NULL列不兼容。