我认为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`))')
请帮忙!
答案 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)
你一定会收到这个错误。你必须在推文中保留至少一条记录。