2013-11-20 58 views
1

假設我有以下設置:如何指定列中的值必須已經存在於另一個表中?


CREATE TABLE t1 (
    id integer PRIMARY KEY, 
    txt character varying(30)); 

CREATE TABLE t2 (
    id integer PRIMARY KEY, 
    t1_id integer, 
    t1_txt character varying, 
    FOREIGN KEY (t1_id) REFERENCES t1(id)); 

對於...嗯,「優化」的原因,我需要t2.t1_txt在T1某處存在,彷彿它是一個外鍵,但沒有一個獨特的約束。我的第一個問題是:做這件事的最好方法是什麼?

我的第二個問題是:使用這些相同的表,當t2.t1_id = t1.id時,強制t2.t1_txt與t1.txt重合的最佳方式是什麼,以及如何從t1級聯更新。 txt to t2.t1_txt?

非常感謝。

回答

1

這聽起來像你複製兩者之間的txt值表。您可以做到這一點與插入/更新觸發器,但我會建議使用視圖代替:

CREATE TABLE t1 (
    id integer PRIMARY KEY, 
    txt character varying(30)); 

CREATE TABLE t2 (
    id integer PRIMARY KEY, 
    t1_id integer, 
    FOREIGN KEY (t1_id) REFERENCES t1(id)); 

CREATE VIEW t2ANDt1 
AS 
    SELECT 
    id, 
    t1_id, 
    t1.txt 
    FROM t2 
    INNER JOIN t1 ON t2.t1_id = t1.id 
+0

實際上聽起來不錯。但對於問題1,這個想法是一個約束條件,它指定t1中必須存在t1_txt,而不必使id和t1_id重合。這聽起來像是一個觸發器的工作......有沒有其他方法? –

+0

是否有可能誤解了外鍵的使用? –

+1

@leinaD_natipaC我認爲你的要求聽起來很奇怪 - _typically_ foriegn _ID_被用作鍵而不是非鍵_property_。如果_text_值(在't1'中是非唯一的)需要在t1中存在,那麼是的,我會說使用觸發器來處理,但使用't1_id'將是一個更乾淨的解決方案。 –

0

採取t1_txt出表T2的

t1.id添加到表T2

使其T1的外鍵

+0

好,服用t1_txt出T2的可能是一般做講的最好的事情,但是這正是在這種情況下我不想要。在這個例子中已經有了一個外鍵。 –

+0

我明白你的意思,但它仍然沒有意義。你是說t2有一段文字通過t1_id,另一段文字非常混亂地稱爲t1_text,這不是t1_id指向的那一段?如果是這樣,other_t1_id,或者更好的鏈接表將是潛在的解決方案。 –

相關問題