La documentación
para LAST_INSERT_ID()
dice:
Sabiendo esto, puede hacer que este sea un proceso de varios pasos:
- INSERTAR IGNORAR
- si LAST_INSERT_ID(), entonces listo (se insertó una nueva fila)
- si no, SELECCIONA tu_clave principal DESDE tutabla DONDE (las restricciones ÚNICAS de tus datos insertados)
Ejemplo con estados de EE. UU.:
id | abbrev | other_data
1 | AL | ...
2 | AK |
UNIQUE KEY abbr (abbrev)
Ahora, insertando una nueva fila:
INSERT IGNORE INTO `states` (`abbrev`,`other_data`) VALUES ('AZ','foo bar');
> OK
SELECT LAST_INSERT_ID();
> "3"
// we have the ID, we're done
Insertando una fila que será ignorada:
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!
Alternativamente, existe una posible solución para hacer esto en un solo paso:use REPLACE INTO
en lugar de INSERT IGNORE INTO
- la sintaxis es muy similar
. Sin embargo, tenga en cuenta que hay efectos secundarios con este enfoque, estos pueden o no ser importantes para usted:
- REPLACE elimina+recrea la fila
- entonces los disparadores DELETE son, um, activados
- además, la ID principal se incrementará incluso si la fila existe
INSERT IGNORE
mantiene los datos de la fila anterior,REPLACE
lo reemplaza con nuevos datos de fila