Ir ao conteúdo
  • Cadastre-se

Inserção em mais de uma tabela ao mesmo Tempo MySql


Posts recomendados

Bom dia.

Tem um banco MySql com duas tabelas uma de cliente e outra de endereço com a chave estrangeira de cliente em endereço;

Na hora de incluir os dados eu quero incluir nas duas tabelas ao mesmo tempo se der algum erro não incluir em nenhuma das duas.

Usei o START TRANSACTION e o COMMIT no final. Mas se der erro na inserção dos dados na tabela de endereço ele inserir os dados na tabela cliente numa boa.

 

O que quero é que so seja inserido os dados se der tudo certo nas duas.

START TRANSACTION;Insert into cliente()values();insert into endereco()values90;COMMIT;

Esse é  o comando que estou usando

 

 

Link para o comentário
Compartilhar em outros sites

Estranho, pelo que eu li o MyIsam nao suporta transações de rollback.

Tentei reproduzir no mysql mas não deu. Se eu conseguir novidades posto aqui. Mas a ideia era essa mesmo, primeiro você faz um start transaction, depois respeitando a ordem você deve inserir primeiro o cliente, depois o endereço, se em todas as inserções nao der erro, (você tenta um try catch) seu programa faria um commit,, se não um rollback. 

Vou tentar mais tarde novamente.

Link para o comentário
Compartilhar em outros sites

Carlos, você tem certeza que o ENGINE das duas tabelas é INNODB?

 

Seu conceito está certo, era para funcionar numa boa.

 

Se você falar que ambas são INNODB e isso não funcionar, é algum problema com sua linguagem de programação, principalmente se a linguagem necessitar de LIB externa para se comunicar com o banco de dados.

 

Se executar isso direto no workbench, sqlfront ou no prompt, tenho certeza q vai funcionar.

Link para o comentário
Compartilhar em outros sites

Carlos, você tem certeza que o ENGINE das duas tabelas é INNODB?

 

Seu conceito está certo, era para funcionar numa boa.

 

Se você falar que ambas são INNODB e isso não funcionar, é algum problema com sua linguagem de programação, principalmente se a linguagem necessitar de LIB externa para se comunicar com o banco de dados.

 

Se executar isso direto no workbench, sqlfront ou no prompt, tenho certeza q vai funcionar.

 

Direto do workbenck ele insere normal, mas se der erro em alguma tabela ele insere nas outras normalmente.

Vou tentar desabilitando o AUTOCOMMIT.

Link para o comentário
Compartilhar em outros sites

Direto do workbenck ele insere normal, mas se der erro em alguma tabela ele insere nas outras normalmente.

Vou tentar desabilitando o AUTOCOMMIT.

Mas..... você tá fazendo ROLLBACK caso dê erro? hehehe ^^

 

Mesmo com o AUTOCOMMIT do próprio WORKBENCH (vá em parâmetros e desabilite), não era pra você ter esses problemas 

Link para o comentário
Compartilhar em outros sites

Mas..... você tá fazendo ROLLBACK caso dê erro? hehehe ^^

 

Mesmo com o AUTOCOMMIT do próprio WORKBENCH (vá em parâmetros e desabilite), não era pra você ter esses problemas 

Como ficaria o comando com o ROLLBACK?

Não estou usando por que vou fazer essa inserção de dados a partir de uma app. Se ele der erro na hora de inserir gera uma exceção na APP.  Por isso não usei o ROLLBACK.

Link para o comentário
Compartilhar em outros sites

Como ficaria o comando com o ROLLBACK?

Não estou usando por que vou fazer essa inserção de dados a partir de uma app. Se ele der erro na hora de inserir gera uma exceção na APP.  Por isso não usei o ROLLBACK.

 

É justamente se der exceção que você aplicaria o RollBack, porque por exemplo, você cadastra o cliente e deu certo, e se a exceção for no endereço e você não der rollback na transação vai ficar do mesmo jeito. Você vai ter um cliente sem endereço.

 

Vamos supor que você inicia uma transação, então os dados ficam voando ai no seu computador, mas não grava. Se você der commit ele grava, se você der rollback ele seria como se limpasse essa transação e nada foi feito em seu banco, entendeu ?

RollBack é o oposto do commit.

 

Se for no sql é rollback.

qual linguagem que você está utilizando ?

Link para o comentário
Compartilhar em outros sites

É esse o problema então @Carlos Barauna, caso dê algum erro, você tem que fazer ROLLBACK para voltar os dados como estavam antes do START TRANSACTION

 

Para ficar didático e bem simples, é assim:

START TRANSACTION; UPDATE TABLE blablabla SET campo = 10 WHERE codigo = 27; IF (algum_erro)   BEGIN      ROLLBACK;   END;ELSE   BEGIN      COMMIT;   END;

Lembrando que comandos de transação, só funcionam com o ENGINE INNODB, MYISAM não funciona, e outros ENGINE não tenho conhecimento para falar ^^

Link para o comentário
Compartilhar em outros sites

É esse o problema então @Carlos Barauna, caso dê algum erro, você tem que fazer ROLLBACK para voltar os dados como estavam antes do START TRANSACTION

 

Para ficar didático e bem simples, é assim:

START TRANSACTION; UPDATE TABLE blablabla SET campo = 10 WHERE codigo = 27; IF (algum_erro)   BEGIN      ROLLBACK;   END;ELSE   BEGIN      COMMIT;   END;

Lembrando que comandos de transação, só funcionam com o ENGINE INNODB, MYISAM não funciona, e outros ENGINE não tenho conhecimento para falar ^^

valeu Erciley mas ficou muito complicado deixar isso dentro da aplicação foi tentar fazer essa persistência usando  o HIBERNATE. Não queria usar ele mas não tem jeito.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!