Mysql 得到一个;外键约束失败“;即使我有;“关于删除级联”;
我认为删除级联的要点是不会发生这种情况我有以下表格:Mysql 得到一个;外键约束失败“;即使我有;“关于删除级联”;,mysql,sql,foreign-keys,cascade,Mysql,Sql,Foreign Keys,Cascade,我认为删除级联的要点是不会发生这种情况我有以下表格: CREATE TABLE Tweets ( tweetID INTEGER NOT NULL AUTO_INCREMENT, userID INTEGER NOT NULL, content VARCHAR(140) NOT NULL, dateTime TIMESTAMP NOT NULL DEF
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)
);
问题是,当我试图删除一条附带民意调查的Tweet时,我(通过Flask)得到以下错误:
救命啊 您肯定会遇到这个错误。您必须在tweets中保留至少一条记录。您必须在
外键(tweetID)引用tweets(tweetID)
根据报告:
级联:从父表中删除或更新行,然后
自动删除或更新子表中的匹配行。
同时支持删除级联和更新级联
此外,根据该报告:
对于InnoDB以外的存储引擎,在定义
列使用引用tbl_name(col_name)子句,该子句没有
实际效果,并仅作为备忘录或评论,向您提供
您当前定义的列旨在引用
另一个表中的列
因此,由于外键是从子表到父表的,它使foo成为父表并轮询子表,因此从Tweets中删除一行将级联删除到池,前提是您使用InnoDB或其他支持它的存储引擎 更新:
此错误是因为您在poll和twitter之间存在关系。。。如果没有级联,您必须删除或更新轮询,删除与将被删除的Tweet的关系。或者在删除级联时使用
:
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;
这确实是删除级联的要点。您会得到错误,因为您的代码没有在delete cascade上声明从“poll”到“tweet”
这将在“Tweets”中删除相应行时删除“Polls”中的行。“因此,如果您使用InnoDB或其他支持它的存储引擎,从Tweets中删除一行将级联删除到池中。”。。。那么,为什么这是一个错误呢?我想删除一些附加了民意调查的tweet,为什么不起作用呢?这个错误是因为民意调查和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;
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
);