2017-09-05 55 views
0

我在將兩個約束條件的約束添加到已存在的表時遇到困難。我正在處理下面的兩個關係,並試圖將約束添加到「books」表中。PostgreSQL:添加具有多個條件的約束

的關係是:

  1. ((book_id),標題,AUTHOR_IDsubject_id

  2. 科目((subject_id),主題,地點)

其中關鍵字是主要關鍵字,而斜體是外鍵。

第一標準/條件是subject_id是NOT NULL,那插入一個新的書元組成書時,已經存在作爲對象關係的主鍵subject_id

ALTER TABLE books ADD CONSTRAINT hasSubject 
    CHECK(subject_id IS NOT NULL AND subject_id REFERENCES subjects(subject_id)) 

我不斷收到錯誤消息:「語法錯誤或接近‘參考’」

任何想法?先謝謝你!

回答

1

REFERENCES是一個單獨的約束類型。所以,你需要兩個約束:

ALTER TABLE books ADD CONSTRAINT chk_books_subject_id 
    CHECK (subject_id IS NOT NULL); 

ALTER TABLE books ADD CONSTRAINT fk_books_subject_id 
    FOREIGN KEY (subject_id) REFERENCES subjects(subject_id); 

我把這兩個ALTER TABLE聲明,強調他們是不同的。他們可以合併成一個聲明。

編輯:

在一個聲明:

ALTER TABLE books 
    ADD CONSTRAINT chk_books_subject_id CHECK (subject_id IS NOT NULL), 
    ADD CONSTRAINT fk_books_subject_id FOREIGN KEY (subject_id) REFERENCES subjects(subject_id); 
+0

謝謝!你是否願意展示如何結合這兩個約束?我嘗試用「AND」語句將兩者結合起來。所以:「...不是NULL)和FOREIGN KEY(subject_id)...」,但是收到一條語法錯誤信息,抱怨「在」AND「處或附近。 – Ninu

+0

再一次,謝謝!! :)有可能加入兩個約束,並用一個共同的名稱「hasSubjects」來引用它們?換句話說,是否有可能只用一個「ADD CONSTRAINT」術語來重寫這個單一語句,同時保持相同的功能? – Ninu

+0

@Ninu ...。不,這是不可能的。有兩個限制。 –