Autor Tópico: Cadastro de CNPJ não aceita NULL em MySQL  (Lida 6480 vezes)

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Cadastro de CNPJ não aceita NULL em MySQL
« Online: 12 de Janeiro de 2012, 10:15 »
Olá,
numa tabela de cadastro tenho o index unique no campo cnpj para não repetir cadastros.
Nos cadastros dos quais não tenho o CNPJ, este campo fica em branco, mas permitiu salvar apenas 1 registro. No segundo, ele bloqueia pois considera duplo (o NULL ou zero ou empty, sei lá).
Como contornar isso?
[ ]

Offline fpissarra

  • Usuário Ubuntu
  • *
  • Mensagens: 246
    • Ver perfil
    • Lost in the e-Jungle
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #1 Online: 12 de Janeiro de 2012, 17:18 »
Não usando a restrição 'unique'...

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #2 Online: 12 de Janeiro de 2012, 18:31 »
Qual o mecanismo de armazenamento? Lá na documentação fala que só não funciona com o BDB, que se não me engano, nem funciona nas ultimas versões -- não aparece no manual do 5.6... se a coluna aceita null, deveria funcionar.

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #3 Online: 13 de Janeiro de 2012, 08:52 »
Mas sem unique, pode haver cadastros dobrados (duplos)...

O mecanismo de armazenamento é MyISAM.


Offline agente100gelo

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.369
  • @Ceará
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #4 Online: 13 de Janeiro de 2012, 09:35 »
A validação de não existência do CNPJ não pode ser feita pelo sistema? Ou as informações são jogadas diretas no BD?
Advogado e analista de sistema cearense.
Twitter: @glaydson

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #5 Online: 13 de Janeiro de 2012, 09:59 »
Também pensei nesta possibilidade. O PHP verificaria se não há outro cadastro igual. Isso dá para ser escrito, teria seus prós e seus contras.
Achei (e ainda acho) que os programadores usam os recursos que me parecem mais fáceis no MySQL.

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #6 Online: 13 de Janeiro de 2012, 10:11 »
Segundo o manual do MySQL:
A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. This constraint does not apply to NULL values except for the BDB
storage engine. For other engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix.

Mas o comando seria qual?
ALTER TABLE `tb_teste` ADD UNIQUE (`mycode`) INT( 10 ) NULL ?????

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #7 Online: 13 de Janeiro de 2012, 11:11 »
Tentei fazer um script para verificar se já existe o mycode no DB, mas fica complicado, pois além de gerar mais uma query tem a dificuldade de bloquear quando for um insert into e não bloquear quando for update, sem falar que tem que arrumar um jeito de interromper o processamento.
O MySQL parece a indicação correta para tal procedimento. Só preciso de uma ajudinha
[ ]

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #8 Online: 13 de Janeiro de 2012, 14:41 »
Progressos:
Primeiro remover qualquer index que possa haver no mycode.

Código: [Selecionar]
ALTER TABLE tb_teste MODIFY mycode INT NULL
Na estrutura ele aumento o tamanho em 1 ponto(de 10 para 11),
  muda o padrão NONE para NULL, e
  marca o checkbox NULO.

Código: [Selecionar]
ALTER TABLE tb_teste ADD UNIQUE INDEX ( mycode )
Pergunta:
Quando insiro dados pelo próprio MySQL ele aceita como null. Se eu uso um script em PHP ele aceita como zero. Porque isso ocorre??

Offline agente100gelo

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.369
  • @Ceará
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #9 Online: 13 de Janeiro de 2012, 14:55 »
Como está sua query de inserção?

Eu recomendo que você faça a validação pelo PHP. O que é uma query a mais? ;)
Advogado e analista de sistema cearense.
Twitter: @glaydson

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #10 Online: 13 de Janeiro de 2012, 15:39 »
Aceito e não descarto nenhuma sugestão, mas uso o mesmo script para inserir, mostrar, e alterar dados. Super-simplificado, seria:

Código: [Selecionar]
if ((isset $_POST[submit] or $_POST[submit_edit]))
$myvar =$_POST[myvar]
$query insert ou update
<input type="submit" name=submit ou submit_edit>
Precisaria uma saída no insert, e mais duas, com verificação no update, pois pode ser gravado, mas não pode ser gravação dupla. Muito complicado deixar sair depois do } dos ifs. Só sobraria um header para outro lugar com msg de erro, o que parece meio desagradável.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #11 Online: 13 de Janeiro de 2012, 15:46 »
Dá pra mostrar o desc campo? Não consegui reproduzir esse comportamento, veja:
Código: [Selecionar]
mysql> create table teste (
    -> id int(10) unsigned not null auto_increment,
    -> dadounico int(10) null unique,
    -> primary key(id));
mysql> insert into teste (dadounico) values (100);
mysql> insert into teste (dadounico) values (NULL);
mysql> insert into teste (dadounico) values (NULL);
mysql> insert into teste (dadounico) values (200);
E o resultado foi o espereado
Código: [Selecionar]
mysql> select * from teste;
+----+-----------+
| id | dadounico |
+----+-----------+
|  2 |      NULL |
|  3 |      NULL |
|  1 |       100 |
|  4 |       200 |
+----+-----------+
O desc teste:
Código: [Selecionar]
mysql> desc teste;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| dadounico | int(10)          | YES  | UNI | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
« Última modificação: 13 de Janeiro de 2012, 15:49 por irtigor »

Offline maurov

  • Usuário Ubuntu
  • *
  • Mensagens: 446
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #12 Online: 13 de Janeiro de 2012, 16:13 »
Show esse teste.
Não uso o mysql direto. Fui de mysql -u root -p, mas depois não sei selecionar pelo use.
Então copiei o bloco que o phpmyadmin mostra.

Código: [Selecionar]
1 100 number one
  2 200 123two7890
  3 300 three chec
  5 0 quatro
  6 NULL cinco
  7 NULL sete

Repare que o NULL aparece aqui quando os dados são inseridos direto pelo mysql. Se insiro pelo script php, onde busco de $_post, o dado é salvo como zero.

Offline irtigor

  • Equipe Ubuntu
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.344
  • Delete, delete, delete!
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #13 Online: 13 de Janeiro de 2012, 17:06 »
Ah, o problema é que não está passando NULL e o valor padrão do campo é zero. Reveja as aspas e linhas verticais e você, provavelmente, vai querer tratar espaço em branco como NULL.

Offline agente100gelo

  • Administrador
  • Usuário Ubuntu
  • *****
  • Mensagens: 4.369
  • @Ceará
    • Ver perfil
Re: Cadastro de CNPJ não aceita NULL em MySQL
« Resposta #14 Online: 13 de Janeiro de 2012, 17:07 »
Provavelmente você está inserindo
insert into tabela (id,nome) values ('','Qualquer coisa')
Como o valor é vazio, está se transformando no número 0.
Advogado e analista de sistema cearense.
Twitter: @glaydson