Wie löscht man eine unbenannte Prüfbedingung in einer PostgresQL-Tabelle?

9

Ich habe eine PostgresQL-Tabelle erstellt, aber einer der Spalten eine unbenannte Prüfbedingung hinzugefügt:

CREATE TABLE FOO
(
id serial primary key,
price_range smallint CHECK (price_range > 0),
url varchar(255)
);

Jetzt möchte ich diese Einschränkung entfernen, aber ich kann nicht herausfinden, wie. Die typische ALTER TABLE ... DROP CONSTRAINT ... braucht eine, constraint_nameaber ich habe keine.

Ich weiß, dass es hier eine Antwort gibt, aber als ich versuchte, den Namen meiner Prüfbedingung zu bestimmen, indem ich der Antwort dort folgte:

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

Alles, was ich zurückbekam, war eine einzelne Einschränkung, deren constraint_nameEintrag foo pkeysich auf die Primärschlüsseleinschränkung und nicht auf meine Überprüfung der priceSpalte bezieht . Diese Antwort hat mir also nicht geholfen, es sei denn, mir fehlt etwas.

Wie kann ich diese Einschränkung aufheben, ohne Daten zu verlieren?

Vielen Dank!

Kilgoretrout
quelle

Antworten:

10

Die Einschränkung hat einen Namen, unabhängig davon, ob Sie ihn angegeben haben oder nicht.

In psql \d foowerden alle Tabelleneinschränkungen zusammen mit ihren automatisch zugewiesenen Namen aufgelistet.

Sie finden diese auch, indem Sie die Katalogtabellen direkt abfragen:

SELECT conname
FROM pg_constraint
WHERE
  conrelid = 'foo'::regclass AND
  contype = 'c'

Der Tabellenname kann bei Bedarf schemaqualifiziert werden (z 'public.foo'::regclass. B. ).

contype = 'c'filtert es auf CHECKEinschränkungen herunter ; Die contypeWerte für andere Einschränkungstypen sind hier dokumentiert .

Nick Barnes
quelle