A documentação para
LAST_INSERT_ID()
diz:Sabendo disso, você pode fazer disso um processo de várias etapas:
- INSERIR IGNORAR
- se LAST_INSERT_ID(), então concluído (nova linha foi inserida)
- senão SELECT your_primary key FROM yourtable WHERE (as restrições UNIQUE dos seus dados inseridos)
Exemplo com estados dos EUA:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Agora, inserindo uma nova linha:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Inserindo uma linha que será ignorada:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AK','duplicate!');
> OK
SELECT LAST_INSERT_ID();
> "0"
// oops, it already exists!
SELECT id FROM `states` WHERE `abbrev` = 'AK'; // our UNIQUE constraint here
> "2"
// there we go!
Como alternativa, há uma solução possível para fazer isso em uma etapa - use
REPLACE INTO
em vez de INSERT IGNORE INTO
- a sintaxe é muito semelhante
. Observe, no entanto, que existem efeitos colaterais com esta abordagem - estes podem ou não ser importantes para você:- REPLACE exclui+recria a linha
- então os acionadores DELETE são acionados
- além disso, o ID principal será incrementado mesmo que a linha exista
INSERT IGNORE
mantém os dados da linha antiga,REPLACE
substitui por novos dados de linha