Ir para conteúdo

Arquivado

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

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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

Compartilhar este post


Link para o post
Compartilhar em outros 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

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.