0

pointsフィールドを持つテーブルがあります

id(primary key), lat, lon

またcctv_camsテーブル

  cctv_id(primary key), point_id, name

そして最後にspeeding_camsテーブル

speeding_id(primary key), point_id_a, point_id_b, name

それぞれ、cctv_cams独自speeding_camsのポイント セットがあります。彼らは同じ点を共有していません。1 つcctv_camsの行で複数の行を参照できpointsます。cctv_cams対応する がない場合、行は存在できませんpoints

外部キーを設定しようとしたので、 を削除するcctv_camsと、対応pointsするものもすべて削除されます。これを達成するには、すべてのテーブルで外部キーを定義する必要があるように見えますか?

更新:テーブルの再設計に関する説明

ポイント自体は 1 つの行ではなく、pointsテーブル内の一連の行です。1 つの論理ポイントに対して、多くのポイントを挿入すると、一連のすべてのポイントが 1 つのポイントとして識別されます。このような一連のポイントを参照する必要がある 3 つの情報源があります。

  1. cctv_camsテーブル
  2. speeding_cams点 A の
  3. speeding_camsB点の表

カスケードに戻る - たとえば、スピード違反のカム レコードを削除すると、一連のポイント A と B もすべてpointsテーブルから削除する必要があります。cctv カム レコードも同様です。

4

1 に答える 1

0

通常、外部キーを持つテーブルを次のように定義する必要があります。

CREATE TABLE cctv_cams (
cctv_id INTEGER PRIMARY KEY,
point_id INTEGER,
name TEXT,
FOREIGN KEY (point_id) REFERENCES points(id) ON DELETE CASCADE ON UPDATE CASCADE);

これpointsにより、 の要素cctv_camsが削除されます。逆に、削除cctv_camsによって対応するpointsエントリが消去されるようにするには、トリガーを定義する必要があります。

CREATE TRIGGER points_cctv_cams_Trigger AFTER DELETE ON cctv_cams
BEGIN
  DELETE FROM points WHERE id = old.point_id);
END;

cctv_camsの複数のエントリを持つ1つの行に関してはpoints、定義は実際にはそれを示していません。一行は一行。スキーマを修正する必要があるかもしれません。


外部キーに関する詳細情報:

外部キーのサポートが有効になっているかどうかを確認するには、次を使用します。

PRAGMA foreign_keys;

有効になっていることを確認するには、次を使用します。

PRAGMA foreign_keys = ON;

接続するたびに設定する必要があります。毎回それを行う必要がない唯一の方法は、SQLite がどちらもコンパイルされていないSQLITE_OMIT_FOREIGN_KEY場合SQLITE_OMIT_TRIGGERです。これは、コピーをどこから入手したかによって変わる可能性があるため、foreign_keys値を確認してください。お使いのバージョンで ON が提供されている場合は、常に ON になります。データベースではなく、エンジンに依存していることを覚えておいてください。

于 2012-12-11T19:23:01.110 に答える