Користувацьке унікальне обмеження стовпця, застосовується лише у випадку, якщо один стовпець має конкретне значення


19

Чи можливо мати спеціальне унікальне обмеження стовпця таким чином? Припустимо, у мене є два col, subsetі typeобидва рядки (хоча типи даних, мабуть, не мають значення).

Якщо typeце "вірно", то я хочу, щоб поєднання typeі subsetбуло унікальним. Інакше обмежень немає. Я використовую PostgreSQL 8.4 на Debian.


Відповіді:


31

Іншими словами, ви хочете subsetбути унікальними, якщо type = 'true'. Частковий унікальний індекс буде робити це:

CREATE UNIQUE INDEX tbl_some_name_idx ON tbl (subset) WHERE type = 'true';

Таким чином, ви навіть можете комбінації з NULLунікальними, що неможливо інакше - як детально в цій відповіді:
PostgreSQL унікальне обмеження для багатьох стовпців та значення NULL


Дякую Ервіну. Я не бачив цього варіанту, коли переглянув документацію. Більш пряма посилання - postgresql.org/docs/current/interactive/indexes-partial.html . Див. Приклад 11-3.
Faheem Mitha

@FaheemMitha: Я зв'язав один рівень вище, так як вам потрібно об'єднати в частковий індекс з унікальним індексом .
Ервін Брандстеттер

1
@Erwin На цій сторінці (про часткові індекси) є приклад з частковим унікальним індексом.
ypercubeᵀᴹ

@ypercube: Ага, правильно. Це краще посилання. Я змінив свою відповідь, щоб вказати на цю останню главу.
Erwin Brandstetter

6

Це доповнює відповідь Ервіна вище, але PostgreSQL підтримує купу типів індексів. Вони взагалі не є взаємовиключними. Ви можете думати про це як таке:

  • Індексний метод (btree, GiST, GIN тощо). Виберіть його, якщо потрібно (btree є типовим)
  • Часткове або повне. Якщо частково використовувати пункт де
  • Прямий або функціональний. Ви можете проіндексувати вихід функцій.
  • Унікальний або не унікальний

Всі вони можуть поєднуватися різними способами. Все, що ви робите тут, - це використовувати унікальні та часткові функції, так що ви отримуєте часткові унікальні індекси (що надзвичайно корисно, як ви дізнаєтесь.

Але припустимо, що ви хочете мати нечутливий до регістру індекс у полі підмножини, де тип true. Тоді ви б додали функціональне визначення:

CREATE INDEX my_index_name_idx_u ON tbl (lower(subset)) WHERE type;

Зауважте, це створює унікальний індекс на виході функції нижчого (), викликаного атрибутом підмножини, де тип є істинним.


Отже, індекс у відповіді Ервіна прямий, тоді як той, який у вашому прикладі є функціональним, правильним?
Faheem Mitha

@FaheemMitha: Правильно.
Ервін Брандстеттер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.