Restrinja la entrada a algunas cadenas diferentes


11

Hola, parece que no puedo obtener una restricción que funcione de la manera que espero en postgreSQL. Desde pgadmin ejecuto la siguiente consulta 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';

Cuando se ejecuta esto se convierte a.

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

Espero que esto limite mi entrada para la columna Tipos a una de correo electrónico IRL o minutos. Sin embargo, al ingresar datos de la tabla, esta restricción falla cuando ingreso uno de estos tipos. La columna Tipos es de tipo de caracteres. Alguien sabe cómo arreglar esto. Gracias.


3
A menos que no entienda algo, ¿hay alguna razón por la que no sería mucho más fácil de leer CHECK (type in ('email','post','IRL','minutes')?
rfusca

Respuestas:


15

Cambia tu restricción a

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

El analizador lo convertirá en:

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

Eso debería hacer lo que estás mirando.

Sin embargo, me pregunto si no sería mejor hacer esto:

CREATE TABLE comlog_types (
     type text
);

Y luego agregue una clave foránea para hacer cumplir la restricción. Esto facilitaría agregar tipos en el futuro.


Gracias, eso está resuelto a la perfección. Podría considerar cambiar al método de clave externa en el futuro.
wookie1

2
Sí, funciona muy bien. Pero también puede consultar el tipo de datos de enumeración de PostgreSQL .
XåpplI'-I0llwlg'I -
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.