sql >> Base de Datos >  >> RDS >> Mysql

mysql:después de insertar, ignorar obtener la clave principal

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