Mysql
 sql >> Database >  >> RDS >> Mysql

mysql - dopo l'inserimento ignore get primary key

La documentazione per LAST_INSERT_ID() dice:

Sapendo questo, puoi renderlo un processo in più fasi:

  • INSERIRE IGNORA
  • se LAST_INSERT_ID(), fatto (è stata inserita una nuova riga)
  • altrimenti SELEZIONA la tua_chiave primaria DALLA tua tabella DOVE (vincoli UNICI dei tuoi dati inseriti)

Esempio con stati USA:

id  | abbrev | other_data
 1  | AL     | ...
 2  | AK     |

UNIQUE KEY abbr (abbrev)

Ora, inserendo una nuova riga:

INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done

Inserimento di una riga che verrà ignorata:

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!

In alternativa, c'è una possibile soluzione alternativa per farlo in un solo passaggio:usa REPLACE INTO invece di INSERT IGNORE INTO - la sintassi è molto simile . Tieni presente, tuttavia, che ci sono effetti collaterali con questo approccio, questi possono essere importanti o meno per te:

  • REPLACE cancella+ricrea la riga
    • quindi i trigger DELETE sono, ehm, attivati
    • inoltre, l'ID primario verrà incrementato anche se la riga esiste
    • INSERT IGNORE mantiene i dati della vecchia riga, REPLACE lo sostituisce con i nuovi dati di riga