Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql - nach dem Einfügen ignorieren Primärschlüssel erhalten

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