Cómo insertar una fila si no existe en MySQL

Rayven Esplanada 30 enero 2023
  1. Use REPLACE para insertar si no existe en MySQL
  2. Usa INSERT IGNORE para insertar si no existe en MySQL
  3. Use INSERT ... ON DUPLICATE KEY UPDATE para insertar si no existe en MySQL
Cómo insertar una fila si no existe en MySQL

Este tutorial le muestra cómo insertar una fila en una tabla si aún no existe en miSQL.

Hay tres maneras simples de lograr este problema, usando REPLACE, INSERT IGNORE, o INSERT ... ON DUPLICATE KEY UPDATE.

En primer lugar, imaginemos que tenemos una tabla person estructurada como tal:

CREATE TABLE person (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
address VARCHAR(128) 
);

Con los siguientes registros existentes:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard

Ahora vamos a entrar en las soluciones reales.

Use REPLACE para insertar si no existe en MySQL

Lo que hace REPLACE es sobrescribir los registros existentes cuando se encuentran; si no existe todavía, insertará una nueva fila. Es esencialmente como UPDATE pero con capacidades de INSERT.

Proporcionemos un ejemplo de consulta para ejecutar REPLACE en John Doe.

REPLACE INTO 'person'
SET id = 1,
name = 'John Doe'`,
age = 28,
address = 'Los Angeles, California'

Si John Doe existe, se sobrescribirá con los nuevos datos; si no existe, creará una nueva entrada para John Doe.

Sin embargo, este método no es eficiente para insertar ya que sobrescribe los registros existentes en lugar de simplemente saltárselos si se encuentran. Aunque hace el trabajo, no es la mejor manera de hacerlo.

El nuevo resultado al seleccionar a John Doe será como tal:

id name age address
1 John Doe 28 Los Angeles, California

La edad y la dirección de John Doe han sido modificadas o actualizadas por el script “REPLACE”.

Usa INSERT IGNORE para insertar si no existe en MySQL

Usaremos los mismos datos sin editar de la tabla anterior para esto también.

En INSERT IGNORE, si la clave primaria del registro ya está presente en la base de datos, será silenciosamente ignorada o salteada.

Si quitamos la palabra clave IGNORE, al insertar un registro con un id o clave primaria existente, se abortará la consulta y se mostrará un mensaje de error diciendo que el registro con la clave primaria ya existe.

Después del INSERT, el IGNORE es un sustituto para el aborto debido al error, y en su lugar sólo continúa la consulta aunque no inserte un nuevo registro.

INSERT IGNORE person
SET 'id' = 4,
age = 1000,
address = 'Chicago'

Basándonos en la tabla que declaramos arriba, ya existe un registro con un id o clave primaria 4 (Thor Odinson). Por lo tanto, esta consulta es ignorada por el script y por lo tanto no se actualiza ni se inserta un registro en la base de datos.

El resultado si consultamos a Thor en “persona” sería:

id name age address
4 Thor Odinson 40 Asgard

La edad y la dirección en la consulta no afectaron en absoluto a la fila con id 4.

Use INSERT ... ON DUPLICATE KEY UPDATE para insertar si no existe en MySQL

Si usas la cláusula ON DUPLICATE KEY UPDATE y la fila que quieres insertar es un duplicado en un índice UNIQUE o una clave primaria, la fila ejecutará una Update.

Esto hace esencialmente lo mismo que hace REPLACE.

Digamos que queremos insertar un registro con id 2.

INSERT INTO person (id, name, age, address)
VALUES (1, 'Jane Deer', '33', 'Tallahassee Florida')
ON DUPLICATE KEY UPDATE id = id+1;

El id se incrementa para generar un nuevo registro en lugar de actualizar el existente.

Si consultamos todas las filas de person, el resultado sería este:

id name age address
1 John Doe 27 New York, New York
2 Jane Doe 26 Berlin, Germany
3 Chun Li 24 Beijing, China
4 Thor Odinson 40 Asgard
5 Jane Deer 33 Tallahasee, Florida

Jane Deer, en lugar de reemplazar Jane Doe, se añade como un nuevo registro en la tabla.

La manera más eficiente de tratar de insertar y comprobar su existencia es definitivamente usando INSERT IGNORE.

Sin embargo, las otras dos palabras clave también son utilizables en cada caso, si alguna vez quieres actualizar si una fila que quieres insertar existe, usa REPLACE. Si no quieres que la fila se modifique pero realmente quieres insertar el nuevo registro, usa INSERT ... ON DUPLICATE KEY UPDATE.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn