Come si elimina un vincolo di controllo senza nome in una tabella PostgresQL?


9

Ho creato una tabella PostgresQL ma ho aggiunto un vincolo di controllo senza nome su una delle colonne:

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

Ora voglio rimuovere questo vincolo ma non riesco a capire come. La tipica ALTER TABLE ... DROP CONSTRAINT ... ha bisogno di un constraint_namema non ne ho uno.

So che c'è una risposta qui, ma quando ho provato a determinare il nome del mio vincolo di controllo seguendo la risposta lì:

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

Tutto quello che ho ricevuto è stato un unico vincolo la cui constraint_namevoce era foo pkeyriferita al vincolo chiave principale e non al mio controllo sulla pricecolonna. Quindi quella risposta non mi ha aiutato, a meno che non mi manchi qualcosa.

Come posso eliminare questo vincolo senza perdere dati?

Grazie!

Risposte:


10

Il vincolo ha un nome, indipendentemente dal fatto che sia stato specificato o meno.

Da psql, \d fooverranno elencati tutti i vincoli della tabella, insieme ai loro nomi assegnati automaticamente.

Puoi anche trovarli interrogando direttamente le tabelle del catalogo:

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

Il nome della tabella può essere qualificato da schema se necessario (ad es 'public.foo'::regclass.).

contype = 'c'lo filtra fino ai CHECKvincoli; i contypevalori per altri tipi di vincoli sono documentati qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.