对唯一字符和其他列使用CHECK约束PostgresSQL

时间:2018-11-24 10:44:06

标签: sql postgresql constraints

我有一个设计好的表STAFF,其中有3列供PostgreSQL使用。

staffId VARCHAR(6) PK,
firstName VARCHAR(50),
lastName VARCHAR(50)

我想建立一个CHECK约束,以便staffId的前2个字母必须匹配firstName的第一个字母和lastName的第一个字母,并且后四个数字不能与staffId中的另一个条目相同。 / p>

例如

John Smith - JS0001,
Lisa Jones - LJ0002

因此,如果乔安妮·史密斯(Joanne Smith)加入团队,那么由于莉萨·琼斯(Lisa Jones)已经拥有0002,JS0002将会失败。

我该怎么做?

非常感谢。

1 个答案:

答案 0 :(得分:0)

这似乎不是好的数据库设计。您应该简单地将StaffId声明为serial列,并使其为整数。瞧!完成了。

对于外键引用,整数通常比字符串更有效。他们还可以唯一地标识员工,即使他们的名字发生了变化。

例如,在我居住的国家,妇女(通常)和男人(有时)在结婚或离婚时会改姓。那完全会让您的计划付诸东流。

总而言之,您可以使用uniquecheck约束来做自己想做的事情:

alter table staff add constraint chk_staffId
    check (substr(staffId, 1, 1) = substr(firstname, 1, 1) and
           substr(staffId, 2, 1) = substr(lastname, 1, 1) and
           staffId ~ '^[A-Z][A-Z][0-9]{4}$'
          );

然后将约束实现为表达式的索引:

create index unq_staffId_number on (substr(staffid, 3, 4));