Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Deleu

Integridade + Default Value

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

#
# Dumping data for table tb_usuarios
#

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).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.