1

次のような SQLite テーブルがあります。

CREATE TABLE myTable (
    _id integer primary key autoincrement,
    ...
    ... /* some useful fields */
    ...
    parent integer,
    FOREIGN KEY (parent) REFERENCES myTable (_id)
);

myTable のエントリには、親を持つものと持たないものがあります。ビジネス ロジックは、「円」がないことを保証します。を使用してPRAGMA foreign_keys = ONいるため、外部キー違反が検出されます。

質問:テーブル全体を削除したい場合、実行するだけで十分DELETE FROM myTableですか? または、外部キー違反を避けるために、最初に「葉」を削除し、次にその親などを削除する必要がありますか?

私はそれをテストしましたが、使用するだけでうまくいくDELETE FROM myTable ようです。ただし、これが単なる偶然なのか、信頼できるものなのか (つまり、文書化され、予想される動作) を知りたいと思っています。


ON DELETE CASCADE編集:有効にしていません。これは意図的なものです。

4

1 に答える 1

0

入れる

外部キーを指定PRAGMA foreign_keys = ONし、空のテーブルから開始すると、SQLite はデータの入力を拒否します (ID を除くparent = _id)。次のメッセージが表示されます。

エラー: 外部キー制約に失敗しました。

PRAGMA foreign_keys = OFFしたがって、最初から、または「循環」エントリで少なくとも 1 つのエントリを作成する必要があります。

特定のエントリの削除

外部キーに対してなどのアクションを提供しない場合、SQLite は、外部キー制約のために親に子がある場合、「親エントリ」の削除を拒否します。これはデフォルトの動作であり、「NO ACTION」と同等です。CASCADE

すべてのエントリの削除

DELETE FROM myTableカスケード句がない場合でも、すべてのエントリの削除が可能であり、同じテーブルで外部キー制約をトリガーするべきではありません。テストで確認しましたが、文書化されていない可能性があります。

于 2012-10-30T00:36:38.017 に答える