Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql - après insertion ignorer obtenir la clé primaire

La documentation pour LAST_INSERT_ID() dit :

Sachant cela, vous pouvez en faire un processus en plusieurs étapes :

  • INSÉRER IGNORER
  • si LAST_INSERT_ID(), alors terminé (une nouvelle ligne a été insérée)
  • else SELECT your_primary key FROM yourtable WHERE (contraintes UNIQUE de vos données insérées)

Exemple avec les États américains :

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

UNIQUE KEY abbr (abbrev)

Maintenant, insérez une nouvelle ligne :

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

Insertion d'une ligne qui sera ignorée :

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!

Alternativement, il existe une solution de contournement possible pour le faire en une seule étape - utilisez REPLACE INTO au lieu de INSERT IGNORE INTO - la syntaxe est très similaire . Notez cependant qu'il existe des effets secondaires avec cette approche - ceux-ci peuvent ou non être importants pour vous :

  • REPLACE supprime + recrée la ligne
    • donc les déclencheurs DELETE sont, euh, déclenchés
    • également, l'ID principal sera incrémenté même si la ligne existe
    • INSERT IGNORE conserve les anciennes données de ligne, REPLACE le remplace par de nouvelles données de ligne