sql >> Databasteknik >  >> RDS >> Mysql

mysql - efter infogning ignorera hämta primärnyckel

Dokumentationen för LAST_INSERT_ID() säger:

Genom att veta detta kan du göra detta till en process i flera steg:

  • INSERT IGNORE
  • om LAST_INSERT_ID(), då klar (ny rad infogades)
  • annars VÄLJ din_primära nyckel FRÅN din tabell WHERE (din infogade datas UNIKA begränsningar)

Exempel med delstater i USA:

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

UNIQUE KEY abbr (abbrev)

Nu infogar du en ny rad:

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

Infoga en rad som kommer att ignoreras:

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 finns det en möjlig lösning för att göra detta i ett steg - använd REPLACE INTO istället för INSERT IGNORE INTO - syntaxen är väldigt lik . Observera dock att det finns biverkningar med detta tillvägagångssätt - dessa kan vara viktiga för dig eller inte:

  • REPLACE tar bort+återskapar raden
    • så DELETE-utlösare utlöses, um,
    • Det primära ID:t kommer också att ökas även om raden finns
    • INSERT IGNORE behåller den gamla raddatan, REPLACE ersätter den med ny raddata


  1. MySQL - Ryska tecken visas felaktigt

  2. Välj från en tabell där inte i en annan

  3. 4 sätt att lista alla vyer i MySQL

  4. Lär dig att använda MySQL-databasen