2012-04-27 21 views
9

Tengo un script PHP que ejecuta una consulta MySQL.Usando IF() Con ON DUPLICATE KEY UPDATE en MySQL

$query = "INSERT INTO table (col1, col2) 
      VALUES('$val1', '$val2') 
      ON DUPLICATE KEY UPDATE col2= IF(IS NOT NULL '$val1', 'test', 'col2)"; 

Esto es lo que estoy tratando de hacer: Col1 es la clave principal. Si hay un duplicado, verifica si el valor de inserción para col2 es nulo. De lo contrario, se actualizará con el valor; de lo contrario, el valor permanecerá igual.

Este inserto falla. Cuando trato de ejecutar manualmente en sqlyog (inserción de los valores reales en lugar de variables), me sale el siguiente error: Código de error: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IS NOT NULL.....'

He comprobado el manual de referencia de MySQL para el NO es la comparación NULL operador (http://dev.mysql.com/doc/refman/5.5/en/comparison-operators.html#operator_is-not-null), y también para la Sintaxis INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA (http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html) y creo que estoy usando ambas correctamente, pero obviamente ese no es el caso.

¿Qué estoy haciendo mal?

Como referencia, estoy usando MySQL 5 y la secuencia de comandos se ejecuta en un servidor RHEL5.

Respuesta

12

La sintaxis IS NOT NULL column es incorrecta. Correcto: column IS NOT NULL. No estoy seguro de qué se trata esto 'test'. Usted dice que desea actualizar la columna o mantenerla tal como está.

$query = "INSERT INTO table (col1, col2) 
      VALUES('$val1', '$val2') 
      ON DUPLICATE KEY UPDATE col2 = IF('$val2' IS NOT NULL, '$val2', col2)"; 

que también se puede escribir como:

$query = "INSERT INTO table (col1, col2) 
      VALUES('$val1', '$val2') 
      ON DUPLICATE KEY UPDATE 
      col2 = COALESCE(VALUES(col2), col2)"; 
+0

Muchas gracias por su ayuda! Además, el valor de 'prueba' fue un descuido; este fue un valor que estaba usando para col2 al realizar pruebas, y olvidé eliminarlo. –

Cuestiones relacionadas