Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 得到一个;外键约束失败“;即使我有;“关于删除级联”;_Mysql_Sql_Foreign Keys_Cascade - Fatal编程技术网

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