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.
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.