Оновлення імені обмеження в PostgreSQL


89

Чи можна змінити назву обмеження в Postgres? До мене додано ПК:

ALTER TABLE contractor_contractor ADD CONSTRAINT commerce_contractor_pkey PRIMARY KEY(id);

І я хочу мати іншу назву для цього, щоб відповідати решті системи. Чи слід видалити існуюче обмеження PK і створити нове? Або існує «м'який» спосіб управління ним?

Дякую!

Відповіді:


82

Для первинного ключа ви повинні мати можливість просто:

ALTER INDEX commerce_contractor_pkey RENAME TO whatever_new_name

Однак це не буде працювати для інших типів обмежень. Найкращий варіант - залишити старий і створити новий. Обов’язково робіть це всередині транзакції, щоб система не працювала без неї під час відновлення. (І якщо ви не можете зробити це в угоді, переконайтеся , щоб створити новий перший , перед видаленням старого)


153

Щоб перейменувати існуюче обмеження в PostgreSQL 9.2 або новіших версіях , ви можете використовувати ALTER TABLE :

ALTER TABLE name RENAME CONSTRAINT constraint_name TO new_constraint_name;

1
@ArturoHerrero чи могли б ми перейменувати кілька обмежень одночасно, якщо так, то як?
Ерлан

1
@Erlan ви можете отримати список усіх обмежень за допомогою запиту pg_catalog, перебирати його за допомогою LOOPта використовувати динамічний запит для перейменування.
Євген Ноздрев

1

Ми виявили, що первинні ключі часто відстають від назви основної таблиці. Цей сценарій допоміг нам виявити та виправити тих, хто має проблеми.

select 
    table_name, 
    constraint_name , 
    'ALTER TABLE ' || table_name || ' RENAME CONSTRAINT ' || constraint_name || ' TO ' || left(table_name, 58) || '_pkey;'
from information_schema.table_constraints tc
where constraint_type  = 'PRIMARY KEY' 
and constraint_name <> left(table_name, 58) || '_pkey';

Це знаходить усі таблиці, де ім’я первинного ключа більше не є шаблоном "за замовчуванням" ( <tablename>_pkey), і створює сценарій перейменування для кожного.

Обмеження 58 символів, наведене вище у коді, має враховувати максимальний розмір імен обмежень (63 байт).

Очевидно, сенс перевірити, що повертається, до запуску. Сподіваюся, що це корисно для інших.

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