2013-11-20 24 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,或者更好的链接表将是潜在的解决方案。 –

相关问题