2016-03-28 82 views
1

比方說,我有一個表,樹和表special_treePostgreSQL的UNIQUE約束和參考

CREATE TABLE tree VALUES (name VARCHAR(32) UNIQUE NOT NULL PRIMARY KEY, 
          type VARCHAR(32) NOT NULL); 

CREATE TABLE special_tree VALUES (name NOT NULL REFERENCES tree(name), 
            treat_date DATE, 
            id INT NOT NULL PRIMARY KEY); 

所以我有一個包含有唯一的名稱樹列表的表,但我想說的是,一棵樹可以有多個'treat_date'(出於各種原因)。 由於樹(名稱)是唯一的,我不能在special_tree中添加2個相同的名稱。

是唯一的解決方案是從樹中刪除唯一的,然後添加到處處處理樹表IF語句來檢查名稱是否已經在那裏? (IF EXISTS (SELECT name FROM tree where tree.name = ...))

+0

的 '樹' 的 '名稱' should'n是用作行ID,添加新的字段到'樹'命名爲ID,例如:'id' int(11)NOT NULL auto_increment並將其設置爲主鍵, –

+0

當然,但它只是一個例子,它並不幫助我獨特名稱情況。好吧,我明白了,你要我引用這個id。 – sourpet

+0

沒有理由在名稱上設置唯一約束 –

回答

0

如果您考慮表tree的列name並不意味着所有引用的列也應具有唯一值。看看this example

+0

Nop ...您的示例不起作用。 https://i.gyazo.com/bf85955fba9bc8c7530f6f90c3af7d82.png 這正是我的問題。 – sourpet

+0

它的工作原理是?你爲什麼試圖再次插入值?但是,您可以注意到您的嘗試違反了主鍵約束,而不是唯一的約束。 – max

+0

要驗證示例,只需構建該方案並執行任何選擇查詢。 – max

0

這個最好的解決辦法是(針對MySQL):

CREATE TABLE tree VALUES (
    id_t int(11) NOT NULL auto_increment, 
    name VARCHAR(32) NOT NULL, 
    type VARCHAR(32) NOT NULL, 
CONSTRAINT tree_pk PRIMARY KEY (id_t)); 

CREATE TABLE special_tree VALUES (
    id_st int(11) NOT NULL auto_increment, 
    id_t NOT NULL REFERENCES tree(id_t), 
    treat_date DATE, 
    CONSTRAINT special_tree_pk PRIMARY KEY (id_st)); 

對PostgreSQL:

CREATE TABLE tree VALUES (
    id_t serial primary key, 
    name VARCHAR(32) NOT NULL, 
    type VARCHAR(32) NOT NULL); 

CREATE TABLE special_tree VALUES (
    id_st serial primary key, 
    id_t NOT NULL REFERENCES tree(id_t), 
    treat_date DATE);