Löschen Sie die Einschränkung nach Namen in Postgresql

82

Wie kann ich einen Einschränkungsnamen in Postgresql löschen, indem ich nur den Namen kenne? Ich habe eine Liste von Einschränkungen, die von einem Skript eines Drittanbieters automatisch generiert werden. Ich muss sie löschen, ohne den Tabellennamen zu kennen, nur den Einschränkungsnamen.

Nascar
quelle
Auf welcher Version von PG bist du?
Kuberchaun

Antworten:

134

Sie müssen die Tabellennamen abrufen, indem Sie die folgende Abfrage ausführen:

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

Alternativ können Sie pg_constraintdiese Informationen abrufen

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';

Anschließend können Sie die erforderliche ALTER TABLE-Anweisung ausführen:

ALTER TABLE your_table DROP CONSTRAINT constraint_name;

Natürlich können Sie die Abfrage veranlassen, die vollständige alter-Anweisung zurückzugeben:

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

Vergessen Sie nicht, das table_schema in die WHERE-Klausel (und die ALTER-Anweisung) aufzunehmen, wenn mehrere Schemas mit denselben Tabellen vorhanden sind.

ein Pferd ohne Name
quelle
14

Wenn Sie auf 9.x von PG sind, können Sie die DO-Anweisung verwenden, um dies auszuführen. Tun Sie einfach, was a_horse_with_no_name getan hat, aber wenden Sie es auf eine DO-Anweisung an.

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$$;
Kuberchaun
quelle
3

- Löschen Sie die richtige Fremdschlüsseleinschränkung

ALTER TABLE affiliations
DROP CONSTRAINT affiliations_organization_id_fkey;

HINWEIS:

Zugehörigkeiten -> Tabellenname

sociations_organization_id_fkey -> Contraint-Name

Praveen Kumar C.
quelle