Cadastro de CNPJ não aceita NULL em MySQL

Iniciado por maurov, 12 de Janeiro de 2012, 10:15

tópico anterior - próximo tópico

maurov

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?
[ ]

fpissarra


irtigor

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.

maurov

Mas sem unique, pode haver cadastros dobrados (duplos)...

O mecanismo de armazenamento é MyISAM.


agente100gelo

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

maurov

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.

maurov

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 ?????

maurov

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
[ ]

maurov

Progressos:
Primeiro remover qualquer index que possa haver no mycode.

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.


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??

agente100gelo

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

maurov

Aceito e não descarto nenhuma sugestão, mas uso o mesmo script para inserir, mostrar, e alterar dados. Super-simplificado, seria:

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.

irtigor

#11
Dá pra mostrar o desc campo? Não consegui reproduzir esse comportamento, veja:

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

mysql> select * from teste;
+----+-----------+
| id | dadounico |
+----+-----------+
|  2 |      NULL |
|  3 |      NULL |
|  1 |       100 |
|  4 |       200 |
+----+-----------+

O desc teste:

mysql> desc teste;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| id        | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| dadounico | int(10)          | YES  | UNI | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+

maurov

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.

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.

irtigor

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.

agente100gelo

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