Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql - após inserir, ignore, obtenha a chave primária


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