4

I thought the point of ON DELETE CASCADE was that this wouldn't happen. :\ I have the following tables:

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

The problem is that when I try to delete a Tweet which has a Poll attached to it, I get the following error (via 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`))')

Help please!

4

3 回答 3

6

这确实是重点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
);

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

于 2013-06-12T20:37:15.210 回答
2

ON DELETE CASCADE你必须把FOREIGN KEY (tweetID) REFERENCES Tweets(tweetID)

根据MySQL 外键约束参考

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

此外,根据MySQL 外键参考

对于 InnoDB 以外的存储引擎,可以在定义列时使用 REFERENCES tbl_name(col_name) 子句,该子句没有实际效果,仅作为您当前定义的列的备注或注释引用另一个表中的列。

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

更新:

此错误是因为您在民意调查和推特之间存在关系......没有级联,您必须删除或更新民意调查以删除与将被删除的推文的关系。或使用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;
于 2013-06-12T04:57:14.997 回答
0

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

于 2013-06-12T04:55:07.903 回答