我有兩個城市和郊區的表格。 Postgresql代碼:SQL - 根據預定義值插入有效數據
CREATE TABLE city
(
id uuid PRIMARY KEY,
name character varying NOT NULL,
CONSTRAINT city_id_key UNIQUE (id),
CONSTRAINT city_name_key UNIQUE (name)
)
CREATE TABLE suburb
(
id uuid PRIMARY KEY,
city_id uuid NOT NULL,
name character varying NOT NULL,
CONSTRAINT fk_suburb_city FOREIGN KEY (city_id) REFERENCES city (id),
CONSTRAINT suburb_id_key UNIQUE (id),
CONSTRAINT suburb_name_key UNIQUE (name)
)
我想創建一個名爲地址的表來存儲城市+郊區對。下面是地址表的DDL:我要確保,只有信息的冗餘拷貝插入地址
CREATE TABLE address
(
id uuid NOT NULL,
city_name character varying NOT NULL,
suburb_name character varying NOT NULL
)
。下面是一個例子:
我想允許插入地址的所有CITY_NAME suburb_name對:
SELECT c.name AS city_name, s.name AS suburb_name
FROM city c, suburb s
WHERE c.id = s.city_id
結果:
A - B
A - C
X - Y
對於上述數據我想允許所有對:
A - B
A - C
X - Y
但是,如果有人想插入A - Y對地址,我想DBMS提出一個錯誤R /異常。
問題:
是否有意義檢查這樣的約束?
如果這是一個有效的想法,那麼最好的解決方案是什麼?觸發器,存儲過程,某種約束?
我更喜歡DBSM獨立解決方案。我對建議的解決方案的基本概念更感興趣,而不是使用postgresql特定的解決方案。
反映@Yuri G的答案:我不想在閱讀表格地址時進行任何連接。我想在其中存儲真正的值而不是id。慢插入地址不是問題。快速閱讀對我來說很重要。插入地址後,城市或郊區表中的更改不成問題。所以不需要在地址表中更新。我只想確保插入到地址中的數據是有效的城市 - 郊區對(根據城市和郊區表)。
我的計劃是上傳包含大量數據的城市和郊區表格,並使用它們驗證地址表中的插入。我不想讓我的用戶插入地址,例如:「紐約 - 法蒂瑪賓特穆巴拉克街」,因爲法蒂瑪賓特穆巴拉克街在阿布扎比。
謝謝你的答案。
爲什麼不使用主鍵而不是唯一的?你的ID列中有NULL值嗎? – Teja
Updated,thx @Teja –
城市名稱和郊區名稱的獨特約束可能會導致問題,因爲兩個不同的郊區可能會共享相同的名稱 - 里士滿高地,密蘇里州(聖路易斯)和里士滿高地,俄亥俄州(克利夫蘭)。以及兩個城市 - 伊利諾伊州的斯普林菲爾德和密蘇里州的斯普林菲爾德。 可以添加一個類似的「state」表,並添加city.state_id引用state.id以幫助區分。您還可以考慮將「地址」表製作成視圖,並分別處理插入每個表中的內容。 – Dan