Использование ограничений CHECK для уникальных символов и других столбцов PostgresSQL - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть разработанная таблица с именем STAFF с 3 столбцами для использования в PostgreSQL.

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

Я хотел бы создать ограничение CHECK, чтобы первые 2 буквы staffId должны соответствовать первой букве firstNameи первая буква lastName, и что последние четыре цифры не могут совпадать с другой записью в staffId.

Например,

John Smith - JS0001,
Lisa Jones - LJ0002

, поэтому, если Джоан Смит присоединится к команде, тогда JS0002потерпит неудачу из-за того, что у Лизы Джонс уже есть 0002.

Как я могу это сделать?

Большое спасибо.

1 Ответ

0 голосов
/ 24 ноября 2018

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