Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Fui criar uma integridade entre duas tabelas e acabei com duas dúvidas:
1. Antes a tabela estava em MyISAM e quem 'cuidava da integridade' era o PHP. Porém isso não lhe garante segurança se eu for lá na segunda tabela e deletar alguma coisa (a primeira tabela vai ficar com o ID que não existe). Bom, isso todo mundo aqui sabe, direto ao ponto:
criando um exemplo:
Tabela pessoa:
id, nomePessoa, carro_id...
Tabela carro:
id, marca, modelo...
Ao cadastrar uma nova pessoa, ela é obrigada a ter um carro, então deixei o campo 'carro_id' como not null default 1 (todas as pessoas têm pelo menos o carro 1).
Quando alterei a engenharia para InnoDB e fui criar a integridade, me deparei com as seguintes interessantes situações:
UPDATE pessoa SET carro_id = null;
Quando eu fiz isso, achei que todas as pessoas passariam a ter o carr 1 (já que não permiti valores nulos e o default é 1), mas o que aconteceu foi que ao invés de 1, tudo ficou 0.
Se é default, não deveria assumir esse valor quando eu setasse null ?
Enfim, o que eu quero é o seguinte:
Registrando uma nova pessoa, o carro_id tem que ser 1 (default).
Se a pessoa adquirir o carro 5 e em algum dia o carro 5 for deletado, então ela retorna ao carro 1.
Esse campo NUNCA poderá ser NULO ou 0, terá que ser de algum carro existente OU 1.
O carro 1 NUNCA será deletado.
Any help? :D
DROP TABLE IF EXISTS `tb_usuarios`;
CREATE TABLE `tb_usuarios` (
`id` int(11) NOT NULL auto_increment,
`email` varchar(200) NOT NULL,
`usuario` varchar(255) NOT NULL,
`senha` text NOT NULL,
`level` int(11) NOT NULL default '1',
`tripulacao` int(11) NOT NULL default '0',
`ouros` int(11) NOT NULL default '0',
`atk_c` int(11) NOT NULL default '3',
`def_c` int(11) NOT NULL default '4',
`expatu` int(11) NOT NULL default '0',
`expnext` int(11) NOT NULL default '100',
`bandeira` varchar(255) default NULL,
`quantidade` int(11) NOT NULL default '0',
`atacou` int(11) NOT NULL default '0',
`data_ataque` date default NULL,
`barco` int(11) NOT NULL default '1',
`navegando` smallint(1) NOT NULL default '0',
`vitorias` int(11) NOT NULL default '0',
`derrotas` int(11) NOT NULL default '0',
`cla` smallint(1) NOT NULL default '2',
`user_maxhp` int(11) NOT NULL default '50',
`user_currenthp` int(11) NOT NULL default '50',
`data_nasc` varchar(255) default NULL,
`nome_barco` varchar(255) default NULL,
`mensagem` mediumtext,
`sexo` int(11) default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=107 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;
#
INSERT INTO `tb_usuarios` VALUES (23,'rodrigoalcab@gmail.com','Lelouch','e10adc3949ba59abbe56e057f20f883e',17,13,19227,20,19,74368288,14309837,'e3b2f1d11e15f0914e8148305990f3f7.jpg',274,0,'2010-12-30',9,0,46,88,1,1286,85,'28/03/1989','Queen C.C','٠•●●●●●◙ஜ۩۞۩ஜ◙●●●●●•٠<br>\n<br>\nUm navio não é velas, casco, etc, isso é o que um navio precisa. O que um navio é, o que um navio realmente é : é liberdade.<br>\n<br>\n٠•●●●●●◙ஜ۩۞۩ஜ◙●●●●●•٠',0);
Estrutura + 1º Registro.
Estou trabalhando em parceria com outra pessoa, a coluna a qual eu quero adicionar integridade é a coluna barco.
Eu tinha renomeado ela para barcos_id e depois executei o seguinte script:
UPDATE tb_usuarios SET barcos_id = null;
Foi aí que todos os dados viraram 0. Eu esperava que eles virassem 1 (default value).
Eu penso que aí o null virou zero, pois você definiu o seu valor.
Estranho, deveria dar um erro quando tentasse executar esse UPDATE, pois o campo não pode ser NULL.
Podemos ver a estrutura de sua tabela? Dê um EXPORT, daí tudo fica mais detalhado com o script de criação.