MySQL: Inserindo registro e recuperando ID gerado
Abril 7, 2009
Um dos grandes problemas que costumo ver no MySQL é o seguinte: “Quero inserir um registro em uma tabela, recuperar o ID que foi gerado pelo AUTO_INCREMENT e inserir registros em outras tabelas.”
Vejo por aí muitas soluções, algumas interessantes e outras grandes gambiarras.
Esqueça MAX() +1 , ORDER BY chave DESC LIMIT 1, SHOW TABLE STATUS, entre outros…
Segue abaixo uma das melhores formas para se fazer isso:
2 SELECT LAST_INSERT_ID() INTO @ID;
3 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘xxx‘, ‘yyy‘);
4 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘www‘, ‘zzz‘);
5 INSERT INTO outratabela (chave_estrangeira, coluna3, coluna4) VALUES (@id, ‘uuu‘, ‘iiii‘);
Desta forma você tem 100% de eficiência na recuperação do ID, não tendo problemas em capturar um ID recém-inserido por outro usuário. Com LAST_INSERT_ID() você estará recuperando sempre o último ID gerado pela sua sessão.
Se você estiver usando INNODB engine, ainda pode trabalhar com transações adicionando os comandos START TRANSACTION e COMMIT para ter total integridade dos dados.
MySQL: Trigger no phpMyAdmin
Junho 7, 2008
Muitas pessoas tentam rodar triggers pelo phpMyAdmin e recebem um erro de sintaxe.
Tudo levar a crer que o phpMyAdmin não suporta triggers, mas não é bem assim.
O que ocorre é que o delimitador (separador de comandos) padrão do phpMyAdmin ou até mesmo do console do MySQL é o ponto e vírgula “;”
A sintaxe da trigger também possui ponto e vírgula “;” então quando você executa uma trigger, o phpMyAdmin acredita que você está enviando diversas instruções SQL, assim seu bloco de comando é interrompido no meio do caminho acusando erro de sintaxe.
Para resolver isto é simples, basta alterar o delimitador em tempo de execução.
Por exemplo:
DELIMITER $$ — Seta novo delimitador
DROP TRIGGER IF EXISTS teste $$ — Essa é uma instrução SQL
CREATE TRIGGER teste BEFORE DELETE ON tabela
FOR EACH ROW
BEGIN
COMANDO1;
COMANDO2;
COMANDO3;
END$$ — Essa é outra instrução SQLDELIMITER ; — Volto ao delimitador padrão
Outra opção ainda mais fácil, é utilizar a aba “SQL” do phpMyAdmin e alterar o campo “Delimitador”.
Lembrando que o MySQL introduziu trigger a partir da versão 5.0, caso sua versão seja inferior não funcionará.