Vincola l'input a poche stringhe diverse


11

Ciao, non riesco a far funzionare un vincolo come mi aspetto in postgreSQL. Da pgadmin eseguo la seguente query SQL.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" SIMILAR TO 'email|post|IRL|minutes');
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

Quando eseguito, questo viene convertito in.

-- Check: "TypeCheck"

-- ALTER TABLE "ComLog" DROP CONSTRAINT "TypeCheck";

ALTER TABLE "ComLog"
  ADD CONSTRAINT "TypeCheck" CHECK ("Type" ~ similar_escape('email|post|IRL|minutes'::text, NULL::text));
COMMENT ON CONSTRAINT "TypeCheck" ON "ComLog" IS 'One of email|post|IRL|minutes';

Mi aspetto che ciò limiti il ​​mio input per la colonna Tipi a uno dei messaggi e-mail IRL o minuti. Tuttavia, quando si inseriscono i dati della tabella questo vincolo non riesce quando si inserisce uno di questi tipi. La colonna Tipi è di tipo carattere. Qualcuno sa come risolvere questo problema. Grazie.


3
A meno che non capisca qualcosa, c'è una ragione per cui non sarebbe molto più facile da leggere CHECK (type in ('email','post','IRL','minutes')?
rfusca,

Risposte:


15

Cambia il tuo vincolo in

CHECK (type IN ('email','post','IRL','minutes'))

Questo sarà convertito dal parser in:

CHECK (type = ANY( ARRAY['email','post','IRL','minutes']))

Questo dovrebbe fare quello che stai guardando.

Tuttavia, mi chiedo se non sarebbe meglio farlo:

CREATE TABLE comlog_types (
     type text
);

E quindi aggiungere una chiave esterna per applicare il vincolo. Ciò renderebbe più semplice l'aggiunta di tipi in futuro.


Grazie, è stato risolto perfettamente. Potrei cercare di cambiare il metodo con chiave esterna in futuro.
wookie1,

2
Sì, funziona bene. Ma potresti anche voler controllare il tipo di dati enum di PostgreSQL .
XåpplI'-I0llwlg'I -
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.