即使我有“删除级联”,获取“外键约束失败”

时间:2013-06-12 04:23:05

标签: mysql sql foreign-keys cascade

我认为ON DELETE CASCADE的意思是这不会发生。 :\我有以下表格:

CREATE TABLE Tweets (
    tweetID INTEGER                 NOT NULL AUTO_INCREMENT,
    userID INTEGER                  NOT NULL,
    content VARCHAR(140)            NOT NULL,
    dateTime TIMESTAMP              NOT NULL DEFAULT CURRENT_TIMESTAMP,
    hasPoll INTEGER                 NOT NULL,
    visible INTEGER                 NOT NULL DEFAULT 1,
    PRIMARY KEY (tweetID),
    FOREIGN KEY (userID) REFERENCES Users(userID)
    ON DELETE CASCADE
);

CREATE TABLE Polls (
    pollID INTEGER NOT NULL AUTO_INCREMENT,
    tweetID INTEGER NOT NULL,
    pollOptionText VARCHAR(300),
    PRIMARY KEY (pollID),
    FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID)
);

问题在于,当我尝试删除附加了Poll的推文时,我收到以下错误(通过Flask):

_mysql_exceptions.IntegrityError
IntegrityError: (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`twitter`.`polls`, CONSTRAINT `polls_ibfk_1` FOREIGN KEY (`tweetID`) REFERENCES `Tweets` (`tweetID`))')

请帮忙!

3 个答案:

答案 0 :(得分:5)

这确实是on delete cascade的重点。您收到错误,因为您的代码未将“on delete cascade 从”poll“声明为”tweet“。

CREATE TABLE Polls (
    pollID INTEGER NOT NULL AUTO_INCREMENT,
    tweetID INTEGER NOT NULL,
    pollOptionText VARCHAR(300),
    PRIMARY KEY (pollID),
    FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID)
      ON DELETE CASCADE
);

当在“推文”中删除相应的行时,这将删除“民意调查”中的行。

答案 1 :(得分:2)

您必须在ON DELETE CASCADE

之后加FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID)

根据MySQL Foreign Key Constraints reference

  

CASCADE:从父表中删除或更新行,然后   自动删除或更新子表中的匹配行。   支持ON DELETE CASCADE和ON UPDATE CASCADE。

另外,根据MySQL Foreign Keys reference

  

对于InnoDB以外的存储引擎,可以在定义时使用   列使用REFERENCES tbl_name(col_name)子句,该子句没有   实际效果,并仅作为备忘录或评论给你   您当前定义的列旨在引用a   另一张表中的列。

因此,由于外键是从子表到父表,它使foo成为父表并轮询子表,因此从Tweets中删除行会将删除级联到池中,前提是您使用InnoDB或其他存储支持它的引擎。

<强>更新

此错误是因为您在poll和twitter之间存在关联...没有级联您必须删除或更新轮询删除与将被删除的Tweet的关系。或者使用ON DELETE CASCADE

CREATE TABLE Tweets (
    tweetID INTEGER                 NOT NULL AUTO_INCREMENT,
    content VARCHAR(140)            NOT NULL,
    PRIMARY KEY (tweetID)
);

CREATE TABLE Polls (
    pollID INTEGER NOT NULL AUTO_INCREMENT,
    tweetID INTEGER NOT NULL,
    pollOptionText VARCHAR(300),
    PRIMARY KEY (pollID),
    FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID) 
        ON DELETE CASCADE
);

INSERT INTO Tweets VALUES(1,'tweet');
INSERT INTO Polls VALUES(1,1,"pool");
DELETE FROM Tweets WHERE tweetID = 1;

答案 2 :(得分:0)

你一定会收到这个错误。你必须在推文中保留至少一条记录。