2014-07-06 28 views
1

在SQLite3中,我有一個代表自反關係的表。這是我如何創建它:避免在SQL中以反身關係複製記錄

CREATE TABLE relationships (
    id_relationship INT, 
    id_person_1 INT NOT NULL, 
    id_person_2 INT NOT NULL, 
    description VARCHAR2(300), 

    PRIMARY KEY(id_relationship), 
    FOREIGN KEY(id_person_1) REFERENCES people(id_person), 
    FOREIGN KEY(id_person_2) REFERENCES people(id_person), 
    CONSTRAINT relationship_not_repeated UNIQUE(id_person_1, id_person_2), 
    CONSTRAINT ids_not_equal CHECK(id_person_1 != id_person_2) 
); 

我想補充一個約束,以避免重複,因爲我有同樣的類型,像這樣的兩個外鍵會發生:

ID_RELATIONSHIP ID_PERSON_1  ID_PERSON_2 DESCRIPTION 
--------------- --------------- ------------- --------------- 
1    114    115   family 
2    115    114   family 

回答

3

的最簡單的方法是要求id_person_1 < id_person_2。您可以通過添加一個檢查約束的create table聲明這樣做:

check (id_person_1 < id_person_2); 

請注意,如果你這樣做,那麼你的預期運行一些插入語句可能無法正常工作。您可以通過添加一個insert觸發器來解決此問題,該觸發器將交換兩個人的值,因此較小的值爲首位。

+0

哇,我沒有意識到,這很容易和舒適。我不需要任何觸發器,因爲即時通訊使用Java。所以我唯一需要做的就是將最高的id放在id_person_1中,而另一個放在id_person_2中。非常感謝;) – ivan0590

+0

我說錯了。我想說我會把id放在id_person_1中,而id_person_2是最大的id。再次感謝。 – ivan0590