mysql.h


UPDATE

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]
    [ORDER BY ...]
    [LIMIT row_count]

O:

UPDATE [LOW_PRIORITY] [IGNORE] tbl_name [, tbl_name ...]
    SET col_name1=expr1 [, col_name2=expr2 ...]
    [WHERE where_definition]

UPDATE actualiza columnas de filas existentes de una tabla con nuevos valores. La cláusula SET indica las columnas a modificar y los valores que deben tomar. La cláusula WHERE, si se da, especifica qué filas deben ser actualizadas. Si no se especifica, serán actualizadas todas ellas. Si se especifica la cláusula ORDER BY, las filas se modificarán en el orden especificado. La cláusula LIMIT establece un límite al número de filas que se pueden actualizar.

La sentencia UPDATE soporta los modificadores siguientes:

  • Si se usa la palabra LOW_PRIORITY, la ejecución de UPDATE se retrasará hasta que no haya otros clientes haciendo lecturas de la tabla.
  • Si se especifica IGNORE, la sentencia UPDATE no se abortará si se producen errores durante la actualización. Las filas con conflictos de claves duplicadas no se actualizarán. Las filas para las que la actualización de columnas se puedan producir errores de conversión se actualizarán con los valores válidos más próximos.

Si se accede a una columna de "tbl_name" en una expresión, UPDATE usa el valor actual de la columna. Por ejemplo, la siguiente sentencia asigna a la columna "edad" su valor actual más uno:

mysql> UPDATE persondata SET edad=edad+1;

Las asignaciones UPDATE se evalúan de izquierda a derecha. Por ejemplo, las siguientes sentencias doblan el valor de la columna "edad", y después la incrementan:

mysql> UPDATE persondata SET edad=edad*2, edad=edad+1;

Si se asigna a una columna el valor que tiene actualmente, MySQL lo notifica y no la actualiza.

Si se actualiza una columna que ha sido declarada como NOT NULL con el valor NULL, se asigna el valor por defecto apropiado para el tipo de la columna y se incrementa en contador de avisos. El valor por defecto es 0 para tipos numéricoss, la cadena vacía ('') para tipos de cadena, y el valor "cero" para tipos de fecha y tiempo.

UPDATE devuelve el número de filas que se han modificado. A partir de la versión 3.22 de MySQL, la función de API C mysql_info devuelve el número de filas que han coincidido y actualizado, y el número de avisos que se han obtenido durante la actualización.

Desde la versión 3.23 de MySQL, se puede usar LIMIT row_count para restringir el rango de actualización. La cláusula LIMIT trabaja del modo siguiente:

  • Antes de MySQL 4.0.13, LIMIT restringía el número de filas afectadas. La sentencia se detiene tan pronto como de modifican "row_count" filas que satisfagan la cláusula WHERE.
  • Desde 4.0.13, LIMIT se restringe al número de filas coincidentes. La sentencia se detiene tan pronto como se encuentran "row_count" filas que satisfagan la cláusula WHERE, tanto si se han modificado como si no.

Si se usa una cláusula ORDER BY, las filas serán actualizadas en el orden especificado. ORDER BY está disponible desde MySQL 4.0.0.

Desde la versión 4.0.4 de MySQL, también es posible realizar operaciones UPDATE que cubran múltiples tablas:

UPDATE items,month SET items.price=month.price
      WHERE items.id=month.id;

El ejemplo muestra una fusión interna usando el operador coma, pero un UPDATE multitabla puede usar cualquier tipo de fusión (join) permitido en sentencias SELECT, como un LEFT JOIN.

Nota: no es posible usar ORDER BY o LIMIT con UPDATE multitabla.

Si se usa una sentencia UPDATE multitabla que afecte a tablas InnoDB para las que haya definiciones de claves foráneas, el optimizador MySQL procesará las tablas en un orden diferente del de la relación padre/hijo. En ese caso, la sentencia puede fallar y deshará los cambios (roll back). En su lugar, se debe actualizar una tabla y confiar el las capacidades de ON UPDATE que proporciona InnoDB que harán que las otras tablas se modifiquen del modo adecuado.

Actualmente, no se puede actualizar una tabla y seleccionar desde la misma en una subconsulta.