Constraint não travando...

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP

Pessoal, boa tarde.

Preciso de um help.
Tenho uma constraint num campo da tabela (campo varchar2(1)) e, nele existe uma constraint:

FLG IN ('D','A','C', NULL);

Esta constraint não trava quando digito "F" por exemplo para o campo.

Alguém poderia me identificar o erro???

Muito obrigado,

Trevisolli.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered


Primeiro, não é necessário colocar NULL na constraint.
Outra coisa:
Verifique como estão as propriedades da constraint! Rode esse select:

Selecionar tudo

select deferrable, deferred, status
from user_constraints
where constraint_name='SUA_CONSTRAINT'
Verifique se o status dela está ENABLED.
Verifique se está DEFERRED ( ou seja, só vai fazer a validação no COMMIT).

Deve ser alguma coisa dessas.
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP

Dr. Gori, seguem parâmetros:

DEFERRABLE => NOT DEFERRABLE
DEFERRED => IMMEDIATE
STATUS => ENABLED


Sobre o NULL, o porque de não se colocar na constraint? E caso necessite dos valores ou NULL ?

Grato,

Trevisolli.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

O problema está justamente no NULL.
Todo campo permite NULL a não ser que você crie uma constraint NOT NULL para o campo!
Veja o exemplo abaixo:

Selecionar tudo

SQL> create table SUA_TABELA( c1 varchar2(1), c2 varchar2(1));

Table created.

SQL> alter table SUA_TABELA add check (c2 in ('A', 'B', 'C', NULL));

Table altered.

SQL> insert into SUA_TABELA (c1) values ('X');

1 row created.

SQL> select * from SUA_TABELA;

C C
- -
X
Até aqui, tudo bem, pois eu não violei a constraint. Repare que ele permite que seja incluído o C2 como NULL, mesmo eu não tendo colocado na constraint.
Agora, vamos tentar incluir um valor não permitido: X

Selecionar tudo

SQL> insert into SUA_TABELA (c2) values ('X');
insert into SUA_TABELA (c2) values ('X')
*
ERROR at line 1:
ORA-02290: check constraint (SGA.SYS_C0022120) violated
PROVADO que todo campo é NULL, a não ser que exista a constraint de NOT NULL.

Agora vamos simular o seu exemplo:

Selecionar tudo

SQL> drop table SUA_TABELA

Table dropped.


SQL> create table SUA_TABELA( c1 varchar2(1), c2 varchar2(1));

Table created.

SQL> alter table SUA_TABELA add check (c2 in ('A', 'B', 'C', NULL));

Table altered.

SQL> insert into SUA_TABELA (c2) values ('X');

1 row created.

SQL> 
Veja, que ele permitiu colocar o X no C2, mesmo tendo a constraint. MOTIVO: Gostaria de saber :-D Está aí um bom tópico para pesquisa!
Mas faça isso, retire o NULL que tudo ocorrerá bem!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 10 visitantes