2012-12-11 39 views
0

我有表points與領域SQLite的外鍵的設計問題

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_camsspeeding_cams有自己的SE點數。他們不共享相同的觀點。 一個cctv_cams行可以參考多行points行。 cctv_cams行不能存在,如果它沒有相應的points

我試圖設置外鍵,所以當我刪除cctv_cams時,所有對應的points也會被刪除。它看起來像我必須在所有表中定義外鍵來完成這個?

更新:說明重新設計表格

點本身就不是一列,但在points錶行系列。對於一個邏輯點,我插入許多點,所有這些連續點應該被識別爲1點。 有3個來源應該指這樣的一系列要點。

  1. cctv_cams
  2. speeding_camsA點
  3. speeding_camsB點

返回級聯 - 當我刪除超速例如凸輪記錄,所有系列A和B點也應從points表中刪除。閉路電視攝像機記錄一樣。

+0

我擔心問題的範圍發生了巨大變化。你可能會遇到一個完全分離的設計問題。我建議你先設計一下(看看數據建模軟件,或許像OpenModelSphere) – MPelletier

回答

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一行具有points,您定義多個條目真的不能表明這一點。一行是一行。也許你需要修改你的模式?


外鍵的更多信息:

要檢查外鍵的支持啓用,使用:

PRAGMA foreign_keys; 

,以確保它已啓用,使用:

PRAGMA foreign_keys = ON; 

每次連接時都需要設置。唯一不必每次都要這樣做的方法是SQLite編譯時既不使用SQLITE_OMIT_FOREIGN_KEY也不使用SQLITE_OMIT_TRIGGER。因爲這可能會根據您的副本從哪裏更改,請檢查您的foreign_keys值。如果你的版本給你開啓,它總是會打開。請記住:它不依賴於數據庫,而是依賴於引擎。

+0

我絕對需要重新設計這個。我會盡快用新設計更新我的文章。 – Pablo

+0

@Pablo聽起來像你需要一個cctv_cams_points連接表。 – MPelletier

+0

我需要更好地解釋數據結構,然後你會看到可能不需要聯結表。我會盡快解釋,給我一個機會) – Pablo