使用子查询约束CHECK(NOT IN)

时间:2014-12-08 17:05:19

标签: sql postgresql reference constraints

我有以下表格:

| student |

 - studentID(PK)
 - Name
 - ...

| Jobs |

 - JobID(PK)
 - Job_Name
 - ...

| Application |

 - JobID(FK)
 - StudentID(FK)
 - ApplicationID(PK)
 - stage of application
 - stage status
 - accepted (default to No)

是否有可能对接受约束,以便它只能是“是”'是如果该学生的其他所有被接受的字段是“不”。

即。接受布尔

  

默认' n'约束检查(' y' NOT IN(从应用程序中选择接受)               在哪里Student.StudentID = StudentID));

......或类似的效果?

1 个答案:

答案 0 :(得分:1)

PostgreSQL不允许CHECK约束中的SELECT语句。但是你无论如何都不需要它。

听起来你需要一个部分索引。猜测数据类型。 。

create table application (
   JobID integer,
   StudentID integer,
   ApplicationID serial primary key,
   Stage varchar(25),
   Stage_status integer,
   Accepted boolean not null default false
);

create unique index on application (StudentID, Accepted)
where Accepted = true;

这将只允许每个学生ID为accepted = true的一行。它要求存在任何具有accepted = false的行。


如果你要在PostgreSQL上使用一段时间,你可能想要养成小写标识符的习惯。