PostgreSQL: імена обмежень за замовчуванням


85

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

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Але використання ALTER TABLEдля додавання обмеження, здається, ім'я є обов'язковим:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Це спричинило деякі невідповідності імен у проектах, над якими я працював, і викликає такі запитання:

  1. Чи існує простий спосіб додати обмеження до існуючої таблиці з іменем, яке воно отримало б, якби додано під час створення таблиці?

  2. Якщо ні, то чи слід взагалі уникати імен за замовчуванням, щоб запобігти невідповідностям?


3
Я приймаю за правило уникати імен за замовчуванням саме з цієї причини - у вас трапляється ситуація, коли в кожному розгортанні обмеження мають різні імена.
Пол Томблін,

Відповіді:


35

Керівництво досить ясно говорить про це ( « tableconstraint: Ця форма додає нове обмеження на таблицю , використовуючи той же синтаксис , як CREATE TABLE. »)

Тож ви можете просто запустити:

Приклад ALTER TABLE ADD UNIQUE (a, b);

5
Ах! Я помилково включав CONSTRAINTлайки ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);та отримував помилки. Дякую!
Ian Mackinnon

275

Стандартними іменами індексів у PostgreSQL є:

{tablename}_{columnname(s)}_{suffix}

де суфікс є одним із наступних:

  • pkey для обмеження первинного ключа
  • key для унікального обмеження
  • excl для обмеження виключення
  • idx для будь-якого іншого виду індексу
  • fkey для зовнішнього ключа
  • check для обмеження Check

Стандартним суфіксом для послідовностей є

  • seq для всіх послідовностей

Доказ вашого УНІКАЛЬНОГО обмеження:

ПРИМІТКА: CREATE TABLE / UNIQUE створить неявний індекс "example_a_b_key" для таблиці "example"


10
Дуже корисно, дякую! Варто додати, що зовнішні ключі використовують суфікс, fkeyі що обмеження зовнішнього ключа у багато стовпців, здається, містять лише ім'я першого стовпця.
Ian Mackinnon

1
@IanMackinnon, Це повинна бути найкраща відповідь!
Marcio Mazzucato

Ця інформація золота! Ви можете підтвердити це, запустивши напр.CREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson

6
Саме таку відповідь я шукав, коли гуглив "конвенції про іменування індексу postgresql"
Фантазія Джон

1
@someone ах, вибачте, мабуть, я мав на увазі кінець команд утиліти E.4.3.3. Це останній пункт маркера перед E.4.3.4 Типи даних: "Використовувати імена всіх ключових стовпців при виборі імен обмежень за замовчуванням для зовнішніх ключів (Peter Eisentraut)"
Майкл Хьюсон,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.