2013-11-13 3 views
0

Для одной таблицы мне нужно ограничить дубликаты одного столбца вне области действия другого столбца.Postgresql: создать ограничение, отличное от области видимости

Например, учитывая таблицу demographics, я хотел бы подчеркнуть, что email уникален за пределами person_id. Добавьте к этому упражнению, что обновления до demographics записей невозможны с помощью бизнес-правил.

Учитывая этот набор данных на demographics таблице:

id | email   | city | person_id | 
1 | [email protected] | Buffalo | 100  | 
2 | [email protected] | Boston | 200  | 

Как бы я изменить demographics так, что эта вставка будет нормально:

INSERT INTO demographics (email, city, person_id) VALUES ('[email protected]', 'Miami', '100'); 

Но эта вставка будет поднимать ошибку:

INSERT INTO demographics (email, city, person_id) VALUES ('[email protected]', 'Buffalo', '100'); 

?

+0

Извините, я не понимаю, почему второй должен потерпеть неудачу, но первый не должен. –

+0

@a_horse_with_no_name Второй добавляет электронное письмо 'two @ email.com' человеку' 100', а 'two @ email.com' уже принадлежит человеку' 200'. –

+0

Похож на нарушение BCNF (или даже 4NF). Ремоделирование приведет к тому, что {email, city, person_id} будет разбит на две или даже три таблицы. – wildplasser

ответ

1

Единственный способ реализовать это ограничение, о котором я могу думать, это BEFORE INSERT trigger, что RAISE EXCEPTION, если электронное письмо уже используется другим пользователем person_id. Это не самый эффективный способ создания ограничения (он требует отдельного SELECT на таблице для каждой вставленной строки), но он определенно будет работать.

Смежные вопросы