Это не похоже на хороший дизайн базы данных.Вы должны просто объявить 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));