4

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

問題は、投票が添付されたツイートを削除しようとすると、(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`))')

助けてください!

4

3 に答える 3

6

それがまさに のポイントですon delete cascade。コードが"poll" から "tweet" を宣言していない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)
      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

このエラーは確実に発生します。ツイートに少なくとも 1 つのレコードを保持する必要があります。

于 2013-06-12T04:55:07.903 に答える