Die Dokumentation
für LAST_INSERT_ID()
sagt:
Wenn Sie dies wissen, können Sie dies zu einem mehrstufigen Prozess machen:
- IGNORIEREN EINFÜGEN
- wenn LAST_INSERT_ID(), dann fertig (neue Zeile wurde eingefügt)
- andernfalls WÄHLEN Sie Ihren_Primärschlüssel AUS Ihrer Tabelle, WO (die EINZIGARTIGEN Einschränkungen Ihrer eingefügten Daten)
Beispiel mit US-Bundesstaaten:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Jetzt eine neue Zeile einfügen:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Einfügen einer Zeile, die ignoriert wird:
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!
Alternativ gibt es eine mögliche Problemumgehung, um dies in einem Schritt zu tun - verwenden Sie REPLACE INTO
statt INSERT IGNORE INTO
- die Syntax ist sehr ähnlich
. Beachten Sie jedoch, dass es Nebenwirkungen gibt mit diesem Ansatz - diese können für Sie wichtig sein oder auch nicht:
- REPLACE löscht die Zeile und erstellt sie neu
- DELETE-Trigger werden also, ähm, getriggert
- Außerdem wird die primäre ID erhöht, selbst wenn die Zeile existiert
INSERT IGNORE
behält die alten Zeilendaten,REPLACE
ersetzt sie durch neue Zeilendaten