pegando autoincrement pra uso em procedure

1. pegando autoincrement pra uso em procedure

Eduardo Cereto Carvalho
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á?


  


2. Você tem duas maneiras

Roger de Almeida Haroldo
rogerdealmeida

(usa Mandrake)

Enviado em 23/02/2007 - 22:53h

Usando o PHP
http://www.php.net/mysql-insert-id

Usando o MySQL logo em seguida a inserção
SET @id = LAST_INSERT_ID()


3. GERAR SEQUENCIA PARA PRIMARY KEY CORRETAMENTE EM MYSQL

Bruno
doidopb

(usa Outra)

Enviado em 30/01/2009 - 21:06h

Segue abaixo video aula:
http://www.4shared.com/file/83184225/8661ce0d/C_online.html?dirPwdVerified=ab1866fd






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts