2008-11-13 21 views
17

¿Es posible insertar una fila, pero solo si uno de los valores que ya están en la tabla no existe?¿Es posible insertar una fila pero solo si no existe un valor?

Estoy creando un Enviar información con puntos de referencia para un sistema de comercio electrónico, donde tengo que insertar correo electrónico de su amigo en la tabla de base de datos, pero sólo si no existe ya en la mesa. Esto se debe a que no quiero que más de una persona obtenga los puntos de referencia una vez que el nuevo cliente se registra y compra algo. Por lo tanto, solo quiero un correo electrónico una vez en la mesa.

Estoy usando PHP 4 y MySql 4.1.

Respuesta

21

Si la columna es una clave principal o un índice único:

INSERT INTO table (email) VALUES (email_address) ON DUPLICATE KEY UPDATE 
email=email_address 

Conociendo mi suerte hay una mejor forma de hacerlo sin embargo. AFAIK no hay un equivalente de "ON DUPLICATE KEY DO NOTHING" en MySQL. No estoy seguro del correo electrónico = email_Address, puede jugar y ver si funciona sin tener que especificar una acción. Sin embargo, como dice alguien más arriba, si tiene limitaciones únicas, de todos modos, nada sucederá. Y si desea que todas las direcciones de correo electrónico de una tabla sean únicas, no hay ninguna razón para especificarlo como único en la definición de columna.

+0

Configuré el correo electrónico en una clave única en phpMyAdmin y usé su código. ¡Y funcionó genial! Gracias – alex

+0

Re: ningún equivalente de EN LLAVE DUPLICADA NO HACER NADA. Vea la solución de Todd. Alternativamente, probablemente puedas hacer algo como ON DUPLICATE KEY UPDATE email = email, aunque sin duda es más derrochador. –

1

No estoy seguro de si lo tengo, pero ¿qué pasa con un

try { 
    mysql_query($sql); 
} 
catch(Exception $e) { 

} 

combinado con un índice de campo único en MySQL?

si arroja una excepción, entonces usted sabe que tiene un campo duplicado. Disculpe si eso no responde a su pregunta ..

+0

Gracias por su respuesta, pero no creo que los que resuelve mi problema. Quiero una sola consulta que inserte la fila o no haga nada si falla. – alex

+0

Si se lanza una excepción, la fila no se agregará. Solo puede iniciar sesión o no hacer nada en la captura. – Feet

+0

Pero con la consulta anterior, causaba un error cada vez. Quería que fallara silenciosamente dentro de mySql. – alex

0

Si el campo de correo electrónico era la clave principal, entonces las restricciones en la tabla detendrían la entrada de un duplicado.

6

Lo más probable es algo así como:

IF NOT EXISTS(SELECT * FROM myTable WHERE [email protected]) THEN INSERT INTO blah blah 

que puede ser enrollado en una consulta de base de datos.

32

Esto funciona si usted tiene un índice único o una clave principal en la columna (emailaddr en este ejemplo):

INSERT IGNORE INTO Table (EmailAddr) VALUES ('[email protected]') 

El uso de este si un registro con ese correo electrónico ya existe (duplicado violación llave) en lugar de una error, la instrucción simplemente falla y no se inserta nada.

Consulte el MySql docs para obtener más información.

+0

"INSERT IGNORE" es la mejor respuesta, pero REPLACE (http://dev.mysql.com/doc/refman/5.0/en/replace.html) también es una opción si desea volver a insertar la fila por alguna razón (tal vez un disparador de marca de tiempo o algo así). – gpojd

+4

Tenga cuidado con REEMPLAZAR el incremento de su autoincremento - debajo del capó es solo un DELETE, INSERTAR. –

+0

esto funciona muy bien para mí, debe tener un índice único – Gordon

3

Una modificación ligera/Además de la respuesta de naeblis:

INSERT INTO table (email) VALUES (email_address) 
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 

De esta manera usted no tiene que tirar email=email_address allí y se obtiene el valor correcto para LAST_INSERT_ID() si las actualizaciones de los estados.

Fuente: MySQL Docs: 12.2.5.3

Cuestiones relacionadas