2017-09-05 34 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 ...。不,这是不可能的。有两个限制。 –