Знизьте обмеження за іменем у Postgresql


83

Як я можу скинути ім'я обмеження в Postgresql, просто знаючи ім'я? У мене є список обмежень, які автоматично генеруються сторонніми сценаріями. Мені потрібно їх видалити, не знаючи назви таблиці лише імені обмеження.


Яку версію PG ви використовуєте?
Куберхаун,

Відповіді:


135

Вам потрібно отримати імена таблиць, виконавши такий запит:

SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'

Ви також можете скористатися pg_constraintцією інформацією

select n.nspname as schema_name,
       t.relname as table_name,
       c.conname as constraint_name
from pg_constraint c
  join pg_class t on c.conrelid = t.oid
  join pg_namespace n on t.relnamespace = n.oid
where t.relname = 'your_table_name';

Тоді ви можете запустити необхідний оператор ALTER TABLE:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Звичайно, ви можете змусити запит повернути повний оператор alter:

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';'
FROM information_schema.constraint_table_usage
WHERE table_name in ('your_table', 'other_table')

Не забудьте включити схему table_sche у речення WHERE (і оператор ALTER), якщо є кілька схем з однаковими таблицями.


14

Якщо ви користуєтесь версією 9.x PG, ви можете скористатися оператором DO для запуску цього. Просто зробіть те, що зробив a_horse_with_no_name, але застосуйте це до оператора DO.

DO $$DECLARE r record;
    BEGIN
        FOR r IN SELECT table_name,constraint_name
                 FROM information_schema.constraint_table_usage
                 WHERE table_name IN ('your_table', 'other_table')
        LOOP
            EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';';
        END LOOP;
    END$$;

3

- Відкиньте обмеження правого зовнішнього ключа

ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;

ПРИМІТКА:

приналежності -> Назва таблиці

affiliations_organization_id_fkey -> Назва контракту

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