我有一个设计好的表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将会失败。
我该怎么做?
非常感谢。
答案 0 :(得分:0)
这似乎不是好的数据库设计。您应该简单地将StaffId
声明为serial
列,并使其为整数。瞧!完成了。
对于外键引用,整数通常比字符串更有效。他们还可以唯一地标识员工,即使他们的名字发生了变化。
例如,在我居住的国家,妇女(通常)和男人(有时)在结婚或离婚时会改姓。那完全会让您的计划付诸东流。
总而言之,您可以使用unique
和check
约束来做自己想做的事情:
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));