INSERT INTO poblaciones(Nombre)
SELECT 'Bergantiños'
FROM dual
WHERE NOT EXISTS (SELECT Nombre FROM poblaciones WHERE Nombre = ‘Bergantiños’ LIMIT 1)

Para insertar un registro solo si no existe existen varias soluciones. La más común de ellas, consistente en hacer una subquery comprobando si el registro existe, también es la más ineficiente en el caso de MySQL.

Vamos a explicarlo con un ejemplo. Tenemos la tabla lista_emails

CREATE TABLE lista_emails (
  email varchar(255),
  nombre varchar(255),
  PRIMARY KEY (email)
);

Algo que funcionaría sería:
INSERT INTO lista_emails(email,nombre)
SELECT '[email protected]','Juan'
FROM dual
WHERE NOT EXISTS (SELECT email FROM lista_emails WHERE email='[email protected]' LIMIT 1)

Pero tenemos dos modificadores del INSERT que nos permiten hacer algo más sencillo y con más posibilidades: "INSERT IGNORE" y "REPLACE"

INSERT IGNORE INTO lista_emails(email,nombre) VALUES ('[email protected]','Juan Rodriguez')

INSERT IGNORE saltará el registro si existe.

REPLACE INTO lista_emails(email,nombre) VALUES ('[email protected]','Juan Rodriguez')

REPLACE actualizará el registro si existe, y si no hará un insert.


En una carga de datos, en la que puede haber varias ejecuciones diarias debido a cortes o actualización de los datos, cualquiera de estas dos opciones pueden sernos muy útiles.