sql >> Database >  >> RDS >> Mysql

mysql - na invoegen negeer primaire sleutel

De documentatie voor LAST_INSERT_ID() zegt:

Als je dit weet, kun je er een proces van meerdere stappen van maken:

  • INVOEREN NEGEREN
  • if LAST_INSERT_ID(), dan klaar (nieuwe rij is ingevoegd)
  • anders SELECTEER uw_primaire sleutel UIT uw tabel WAAR (de UNIEKE beperkingen van uw ingevoegde gegevens)

Voorbeeld met Amerikaanse staten:

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

UNIQUE KEY abbr (abbrev)

Nu een nieuwe rij invoegen:

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

Een rij invoegen die wordt genegeerd:

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!

Als alternatief is er een mogelijke oplossing om dit in één stap te doen - gebruik REPLACE INTO in plaats van INSERT IGNORE INTO - de syntaxis lijkt erg op elkaar . Houd er echter rekening mee dat er bijwerkingen zijn met deze benadering - deze kunnen al dan niet belangrijk voor u zijn:

  • REPLACE verwijdert+maakt de rij opnieuw
    • dus DELETE-triggers zijn, um, getriggerd
    • ook wordt de primaire ID verhoogd, zelfs als de rij bestaat
    • INSERT IGNORE behoudt de oude rijgegevens, REPLACE vervangt het door nieuwe rijgegevens


  1. MySql:BESTELLEN DOOR ouder en kind

  2. Hoe vind je unieke paren uit twee kolommen in SQL?

  3. Optimalisatiedrempels - Gegevens groeperen en aggregeren, deel 4

  4. COLLATIE 'utf8_general_ci' is niet geldig voor KARAKTERSET 'latin1'