Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

Alcir Lima

Como inserir dados em duas ou mais tabelas ao mesmo com chaves dinâmic

Recommended Posts

Galera, é o seguinte, tenho três tabelas:

 

cliente(cod,nome,cpf) -> PK = cod

endereco(cod,cod_cliente,rua,no,bairro) -> Pk = cod e FK = cod_cliente (mesmo de cod na tabela cliente)

telefone(cod,cod_cliente,numero) -> Pk = cod e FK = cod_cliente (mesmo de cod na tabela cliente)

 

Minha dúvida:

 

Quero inserir o conteúdo nas três tabelas no mesmo tempo

 

vamos lá:

 

START TRANSACTION;

INSERT INTO cliente(cod,nome,cpf) VALUES('','joao francisco','00800800845');

INSERT INTO endereco(cod,cod_cliente,rua,no,bairro) VALUES('','','rua da silva','25','cabo branco');

INSERT INTO telefone(cod,cod_cliente,numero) VALUES('','','88998899');

INSERT INTO telefone(cod,cod_cliente,numero) VALUES('','','90878907');

COMMIT;

 

Como fazer isso dá certo? meu tipo de tabela eh iNNoDB.

 

Quero inserir as PK de acordo com a FK gerada no insert into cliente, e quero que todas as outras tabelas recebam nessa mesma transação as FK tudo certinho....

 

por favor, alguem me ajuda :)

Share this post


Link to post
Share on other sites

Opa,

 

Você terá que inciar uma trabsação mesmo, o caminho é bem esse, mas conferindo se o INSERT acima foi efetuado com sucesso e utilizando a função LAST_INSERT_ID() para pegar o cod do cliente, por exemplo. Siga esta linha de raciocínio:

 

DELIMITER //
CREATE PROCEDURE cadastro_cliente(var_nome varchar(80))
BEGIN
   INSERT INTO CLIENTE (NOME) VALUES (var_nome);
   SELECT LAST_INSERT_ID() INTO @codCliente;
   IF ((@codCliente <> NULL) OR (@codCliente <> '')) THEN
         INSERT INTO ENDERECO (COD_CLIENTE, ENDERECO) VALUES (@codCliente, var_endereco);
...

 

A função LAST_INSERT_ID() resgata o último número inserido na sequência de uma coluna que contenha a propriedade AUTO_INCREMENT. Este identificador retonado pela citada função, está atrelado à sua THREAD, não sendo visível por outros usuários conectados ao mesmo banco de dados no momento da transação.

 

A cada INSERT você confere se o retorno da função dentro de uma variável local é diferente de vazio ou diferente de NULL. Se for NULO ou VAZIO, ROLLBACK. Se a transação chegar no final, após todos os INSERTs, COMMIT.

 

Qualquer dúvida, volte a postar...DEUS abençõe!! http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Share this post


Link to post
Share on other sites

você acha melhor fazer essa transação a nível de banco de dados ou de programação ?

 

Se for de programação, tem alguma referência para me ajudar?

 

Desde já agradeço atenção

Share this post


Link to post
Share on other sites

Bom dia,

 

Estou tentando solucionar meu problema seguindo este tutorial:

 

http://www.vivaolinux.com.br/artigos/verAr...php?codigo=7177

 

Segue:

 

<code>

DELIMITER $$

 

DROP PROCEDURE IF EXISTS 'cadastro_cliente'$$

CREATE PROCEDURE 'cadastro_usuario'(

IN in_nome VARCHAR(60),

IN in_cpf VARCHAR(11),

IN in_rua VARCHAR(60),

IN in_num VARCHAR(4),

IN in_bairro VARCHAR(60),

IN in_ numero VARCHAR(15),

OUT erro VARCHAR(255)

)

BLOCO1:BEGIN

DECLARE excecao SMALLINT DEFAULT 0;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET excecao = 1; /*caso exista algum erro, a variável excecao terá o valor 1*/

 

START TRANSACTION; /*inicio a transaction*/

 

/*inserindo na tabela usuario*/

 

INSERT INTO usuario (nome, cpf) VALUES (in_nome, in_cpf);

 

/*pegando o valor do id inserido e armazena em uma variável*/

 

SELECT DISTINCT LAST_INSERT_ID() INTO @cod FROM cliente; /*sem o distinct serve, o id se repetirá pelo número total de registros na tabela.*/

 

/*verificando se houve erro*/

IF excecao = 1 THEN

SET erro = 'erro ao inserir na tabela cliente'; /*armazeno o valor na variável OUT erro*/

ROLLBACK; /* dou um rollback, com isso todas as minhas operações são perdidas*/

LEAVE BLOCO1; /*encerro a procedure*/

END IF;

 

/*caso não tenha erro, chamo o outro insert*/

 

INSERT INTO endereco (cod_cliente, rua, num, bairro) VALUES (@cod_cliente, in_rua, in_num, in_bairro);

 

/*verifico se inseriu com sucesso*/

 

IF excecao = 1 THEN

SET erro = 'erro ao inserir endereco';

ROLLBACK;

LEAVE BLOCO1;

END IF;

 

INSERT INTO telefone (cod_cliente, numero) VALUES (@cod_cliente, in_numero);

 

/*verifico se inseriu com sucesso*/

 

IF excecao = 1 THEN

SET erro = 'erro ao inserir telefone';

ROLLBACK;

LEAVE BLOCO1;

ELSE

erro = 'cadastro efetuado com sucesso';

COMMIT; /*aqui eu salvo as minhas inserções e disponibilizo para os demais*/

END IF;

 

END$$

 

DELIMITER ;

 

 

</code>

 

 

Está dando diversos erros...

 

Não tenho experiencia com transações, espero ajuda d vcs

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.