dudus
(usa Ubuntu)
Enviado em 28/11/2005 - 03:17h
Olá amigos tenho uma duvida quando crio um procedure no mysql5.
Bom o objetivo é o seguinte. Imagine que eu tenha duas tabelas, a tabela cliente e a tabhela contatos. Sendo que a tabela contato referencia a tabela cliente:
CREATE TABLE `cliente` (
`idcliente` int(10) unsigned NOT NULL auto_increment,
`nome` varchar(60) NOT NULL default '',
PRIMARY KEY (`idcliente`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `contato` (
`idcontato` int(10) unsigned NOT NULL auto_increment,
`idcliente` varchar(20) unsigned NOT NULL auto_increment,
`nome` varchar(45) NOT NULL default '',
`email` varchar(45) default NULL,
`cel` varchar(10) default NULL,
PRIMARY KEY (`idcontato`),
KEY `contato_FKIndex1` (`idcliente`),
CONSTRAINT `contato_ibfk_1` FOREIGN KEY (`idcliente`) REFERENCES `cliente` (`idcliente`) ON DELETE CASCADE ON UPDATE CASCADE)
ENGINE=InnoDB DEFAULT CHARSET=latin1
Agora imagine que quero criar a interface para adicionar clientes e contatos através de um procedure.esse meu procedure deverá ser chamado por:
CALL pc_addContato('idcliente','nome','email','celular');
Cria um contato para o cliente de id passado.
Quando o idcliente for nulo será criado um novo cliente com o nome que foi passado e um contato ligado a ele com o mesmo nome e os outros dados.
E é nesse ultimo caso que meu problema acontece.
Eu pensei em algumas soluções mas não consegui ter certeza se elas são a prova de falha ou não. ai vai.
Eu preciso do numero de auto increment para saber qual sera o idcliente do cliente que eu gerar pela query:
INSERT INTO cliente VALUES(null,'dudus');
posso fazer isso por usando o banco de dados information_schema do mysql5. Ficaria algo assim:
SELECT AUTO_INCREMENT INTO v_idcliente FROM information_schema.`TABLES` T WHERE TABLE_SCHEMA='testedb' AND TABLE_NAME='cliente' LIMIT 1;
Na teoria isso colocario o auto_increment correto dentro da variavel v_idcliente. Depois de descobrir o auto_increment deveria criar o cliente e depois criar o contato com o idcliente. Mas deveria colocar isso tudo dentro de uma única transação para não permitir que outras queries fossem executadas entre isso, o que poderia alterar meu auto_increment. No final ficaria algo assim:
(...)
START TRANSACTION;
SELECT AUTO_INCREMENT INTO v_idcliente FROM information_schema.`TABLES` T WHERE TABLE_SCHEMA='testedb' AND TABLE_NAME='cliente' LIMIT 1;
INSERT INTO cliente VALUES(null,'dudus');
INSERT INTO contato VALUES(null,'dudus','eduardocereto@gmail.com','99861****');
COMMIT;
(...)
Será que apenas colocar isso dentro de uma transação garante que não será executado nada no meio q altere meu auto_increment?
Será que essa forma de buscar o auto_increment é correta/segura?
Será que existe uma maneira melhor de fazer isso?
Será que o Lula vai tentar se reelejer?
Será?