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

Cómo evitar inserciones duplicadas en una tabla

No tiene una clave única en la dirección de correo electrónico . Esa es su mejor esperanza, ya que muchos John Doe pueden estar en el sistema. Por lo tanto, un índice compuesto único sobre el nombre completo nunca es una buena idea.

Se puede emitir un INSERTAR IGNORAR que continúa después de una infracción duplicada como si nada sucediera (esto es muy poco recomendable y, en su caso, no es posible porque su restricción única en el correo electrónico no está presente). El principal problema de hacer esto es que su tendencia (léase:probablemente) perderá todo el control del flujo de lo que está sucediendo y se quedará con datos no deseados. Así que no lo uses, a menos que seas un profesional.

Se puede emitir e INSERT ON DUPLICATE KEY UPDATE (también conocido como IODKU) que también requiere una clave única (también puede ser un compuesto único). Como tal, no se produciría una nueva fila, sino una actualización de la fila. Como ejemplo, se podría insertar una nueva fila con 4 columnas, pero en caso de infracción de duplicación, se podría realizar una actualización en solo dos de las columnas, como

suponiendo debajo de un PK en una columna invisible id int y una clave única en emailAddr

insert person(firstName,lastName,emailAddr) values 'Joe','Smith','[email protected]' 
on duplicate key update firstName='Joe',lastName='Smith'

Es la clave única en emailAddr la que hace que esto funcione. Queda con solo 1 fila por emailAddr, alguna vez.

Por lo tanto, puede tener un número ilimitado de Joe Smith, pero solo 1 fila por dirección de correo electrónico.

La tabla de creación para la tabla anterior podría verse como

create table person
(  id int auto_increment primary key,
   firstName varchar(50) not null,
   lastName varchar(50) not null,
   emailAddr varchar(150) not null,
   unique key(emailAddr)  -- without this, IODKU will not work
);

También puede emitir comandos ALTER TABLE para agregar restricciones después de crear la tabla. Dependiendo de los datos que contenga, la llamada puede fallar.

Mysql Insert on Duplicate Key Update y Alter Table páginas del manual.

Lo diré nuevamente, sin la configuración de esquema adecuada, IODKU no funcionará y se quedarán con filas no deseadas. Así que no seas flojo al respecto. Esquema de configuración primero permitiéndole tener éxito (con claves únicas), entonces avance hacia el uso de IODKU.