PostgreSQL: имена ограничений по умолчанию

88

При создании таблицы в 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
Я беру за правило избегать имен по умолчанию именно по этой причине - в конечном итоге вы получаете ситуацию, когда в каждом развертывании ограничения имеют разные имена.
Пол Томблин

Ответы:

36

В руководстве это довольно ясно (« ограничение таблицы: эта форма добавляет новое ограничение в таблицу с использованием того же синтаксиса, что и CREATE TABLE ».)

Итак, вы можете просто запустить:

Пример ALTER TABLE ADD UNIQUE (a, b);
a_horse_with_no_name
источник
5
Ах! Я ошибочно включил CONSTRAINTлайк ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);и получил ошибки. Спасибо!
Ian Mackinnon
282

Стандартные имена индексов в PostgreSQL:

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

где суффикс может быть одним из следующих:

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

Стандартный суффикс для последовательностей -

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

Доказательство вашего UNIQUE-ограничения:

ВНИМАНИЕ: CREATE TABLE / UNIQUE создаст неявный индекс example_a_b_key для таблицы example

Фрэнк Хайкенс
источник
10
Очень полезно, спасибо! Стоит добавить, что внешние ключи используют суффикс fkeyи что ограничения внешнего ключа с несколькими столбцами, похоже, включают только имя первого столбца.
Ian Mackinnon
1
@IanMackinnon, это должен быть лучший ответ!
Марсио Маццукато
Эта информация - золото! Вы можете подтвердить это, запустив egCREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson
6
Точно ответ, который я искал, когда гуглил "соглашения об именах индексов postgresql"
Fancy John,
1
@someone ах, извините, я думаю, я имел в виду конец служебных команд E.4.3.3. Это последний пункт маркера перед E.4.3.4 Типы данных: «Использовать имена всех ключевых столбцов при выборе имен ограничений по умолчанию для внешних ключей (Питер Эйзентраут)»
Майкл Хьюсон