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

mysql - efter indsæt ignorer få primær nøgle

Dokumentationen for LAST_INSERT_ID() siger:

Når du ved dette, kan du gøre dette til en flertrinsproces:

  • INDSÆT IGNORER
  • hvis LAST_INSERT_ID(), så færdig (ny række blev indsat)
  • ellers VÆLG din_primære nøgle FRA din tabel WHERE (dine indsatte datas UNIKKE begrænsninger)

Eksempel med amerikanske stater:

id | abbrev | other_data 1 | AL | ... 2 | AK | UNIQUE KEY abbr (abbrev)

Indsætter nu en ny række:

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

Indsættelse af en række, som vil blive ignoreret:

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!
 

Alternativt er der en mulig løsning til at gøre dette i ét trin - brug REPLACE INTO i stedet for INSERT IGNORE INTO - syntaksen er meget ens . Bemærk dog, at der er bivirkninger med denne tilgang - disse kan være vigtige for dig eller ikke:

  • REPLACE sletter+genskaber rækken
    • så DELETE-udløsere udløses, um,
    • Det primære ID vil også blive forøget, selvom rækken eksisterer
    • INSERT IGNORE beholder de gamle rækkedata, REPLACE erstatter det med nye rækkedata


  1. sql-forespørgsel, der grupperer forskellige elementer i buckets

  2. Mysqli-forespørgsel med et SET-variabelt udsagn (dvs. flere forespørgsler)

  3. download RDS snapshot

  4. Sådan genereres 5 tilfældige tal i mysql-lagret procedure