Restringir a entrada para algumas cadeias diferentes

11

Oi Não consigo obter uma restrição funcionando da maneira que espero no postgreSQL. De dentro do pgadmin, eu executo a seguinte 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';

Quando executado, isso é convertido em.

-- 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 isso limite minha entrada para a coluna Tipos a uma mensagem de email IRL ou minutos. No entanto, ao inserir dados da tabela, essa restrição falha ao inserir um desses tipos. A coluna Tipos é do tipo de caractere. Alguém sabe como consertar isso. Obrigado.

wookie1
fonte
3
A menos que eu não esteja entendendo alguma coisa, existe uma razão pela qual não seria muito mais fácil ler para fazer CHECK (type in ('email','post','IRL','minutes')?
Rfusca 02/09/2012

Respostas:

15

Mude sua restrição para

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

Isso será convertido pelo analisador em:

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

Isso deve fazer o que você está olhando.

No entanto, tenho que me perguntar se não seria melhor fazer isso:

CREATE TABLE comlog_types (
     type text
);

E adicione uma chave estrangeira para impor a restrição. Isso tornaria mais fácil adicionar tipos no futuro.

Chris Travers
fonte
Obrigado, isso resolveu perfeitamente. Eu poderia procurar mudar para o método de chave estrangeira no futuro.
Wookie1
2
Sim, funciona muito bem. Mas você também pode querer verificar o tipo de dados enum do PostgreSQL .
XåpplI'-I0llwlg'I - 24/02