2

新しいバージョンの SQLiteは外部キー制約をサポートしています。定義することが可能です

CREATE TABLE MASTER (_ID INTEGER PRIMARY KEY, ...);
CREATE TABLE SERVANT (_ID INTEGER PRIMARY KEY, MASTERID INTEGER, 
  FOREIGN KEY(MASTERID) REFERENCES MASTER(_ID);

ドキュメントによると、デフォルトでは「NO ACTION」が ON DELETE および ON UPDATE に使用されます。しかし、他の DBS とは逆に「NO ACTION」は、削除または更新が実行されないという意味ではないようです。少なくとも私のテスト(*)によれば、完全性を維持するために何も行われていないことを意味しているようです

「NO ACTION」を構成すると、親キーが変更されたり、データベースから削除されたりしても、特別なアクションは実行されません。

したがって

INSERT INTO MASTER (_ID) VALUES (1);
INSERT INTO SERVANT (_ID, MASTERID) VALUES (1,1);
DELETE FROM MASTER;

空のMASTERテーブルと、どこにも指していない外部キーを持つSERVANTテーブルが表示されます。

誰でもこの動作を確認し、そのように実装されている理由を説明できますか? または、外部キーのサポートを機能させるために何かを構成する必要がありますか? 私は SQLite の開発に慣れていないので、これがばかげた質問である場合はご容赦ください。

編集: (*) 私のテストには欠陥がありました。以下の回答を参照してください。

4

2 に答える 2

2

私は自分で答えようとします:

いいえ、正しく構成されていれば、SQLite はこの状況でデータの整合性を維持します。デフォルトでは「NO ACTION」が使用され、参照テーブルからの参照キーがまだある場合、マスター キーの削除または更新が禁止されます (3.7.x でテスト済み)。私の欠点は、データベースへの新しい接続ごとPRAGMA foreign_keys = ON;に構成する必要があることを認識していなかったことです。

編集: SQLite のドキュメントはここで誤解を招くと思います。

于 2013-07-11T19:11:49.097 に答える