Spec-Zone .ru
спецификации, руководства, описания, API
|
Single-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE]table_reference
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
] [ORDER BY ...] [LIMITrow_count
]
Multiple-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE]table_references
SETcol_name1
={expr1
|DEFAULT} [,col_name2
={expr2
|DEFAULT}] ... [WHEREwhere_condition
]
For the single-table syntax, the UPDATE
statement updates columns of existing rows in the named table with new values. The SET
clause indicates which columns to modify and the values they should be given.
Each value can be given as an expression, or the keyword DEFAULT
to set a column
explicitly to its default value. The WHERE
clause, if given, specifies the
conditions that identify which rows to update. With no WHERE
clause, all rows are
updated. If the ORDER BY
clause is specified, the rows are updated in the order
that is specified. The LIMIT
clause places a limit on the number of rows that can
be updated.
For the multiple-table syntax, UPDATE
updates
rows in each table named in table_references
that satisfy the
conditions. In this case, ORDER BY
and LIMIT
cannot be
used.
For partitioned tables, both the single-single and multiple-table forms of this statement support the use of a
PARTITION
option as part of a table reference. This option takes a list of one or
more partitions or subpartitions (or both). Only the partitions (or subpartitions) listed are checked for
matches, and a row that is not in any of these partitions or subpartitions is not updated, whether it satisfies
the where_condition
or not.
Unlike the case when using PARTITION
with an INSERT
or REPLACE
statement, an otherwise valid UPDATE ...
PARTITION
statement is considered successful even if no rows in the listed partitions (or
subpartitions) match the where_condition
.
See Section 18.5, "Partition Selection", for more information and examples.
where_condition
is an expression that evaluates to true for each row to
be updated. For expression syntax, see Section 9.5, "Expression Syntax".
table_references
and where_condition
are is specified as described in Section
13.2.9, "SELECT
Syntax".
You need the UPDATE
privilege
only for columns referenced in an UPDATE
that
are actually updated. You need only the SELECT
privilege for any columns that are read but not modified.
The UPDATE
statement supports the following modifiers:
With the LOW_PRIORITY
keyword, execution of the UPDATE
is delayed until no other clients are reading from the table. This affects only storage engines that use
only table-level locking (such as MyISAM
, MEMORY
, and MERGE
).
With the IGNORE
keyword, the update statement does not
abort even if errors occur during the update. Rows for which duplicate-key conflicts occur are not
updated. Rows for which columns are updated to values that would cause data conversion errors are
updated to the closest valid values instead.
In MySQL 5.6.4 and later, UPDATE IGNORE
statements, including those having an ORDER
BY
clause, are flagged as unsafe for statement-based replication. (This is because the order in which the
rows are updated determines which rows are ignored.) With this change, such statements produce a warning in the
log when using statement-based mode and are logged using the row-based format when using MIXED
mode. (Bug #11758262, Bug #50439) See Section
16.1.2.3, "Determination of Safe and Unsafe Statements in Binary Logging", for more information.
If you access a column from the table to be updated in an expression, UPDATE
uses the current value of the column. For example, the following statement
sets col1
to one more than its current value:
UPDATE t1 SET col1 = col1 + 1;
The second assignment in the following statement sets col2
to the current (updated)
col1
value, not the original col1
value. The result is
that col1
and col2
have the same value. This behavior
differs from standard SQL.
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
Single-table UPDATE
assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that
assignments are carried out in any particular order.
If you set a column to the value it currently has, MySQL notices this and does not update it.
If you update a column that has been declared NOT NULL
by setting to NULL
, an error occurs if strict SQL mode is enabled; otherwise, the column is set to
the implicit default value for the column data type and the warning count is incremented. The implicit default
value is 0
for numeric types, the empty string (''
)
for string types, and the "zero" value for date and time
types. See Section
11.5, "Data Type Default Values".
UPDATE
returns the number of rows that were actually changed. The mysql_info()
C API function returns the number of rows that were matched and
updated and the number of warnings that occurred during the UPDATE
.
You can use LIMIT
to restrict
the scope of the row_count
UPDATE
. A LIMIT
clause is a rows-matched
restriction. The statement stops as soon as it has found row_count
rows that satisfy the WHERE
clause, whether or not they actually were changed.
If an UPDATE
statement includes an ORDER BY
clause, the
rows are updated in the order specified by the clause. This can be useful in certain situations that might
otherwise result in an error. Suppose that a table t
contains a column id
that has a unique index. The following statement could fail with a
duplicate-key error, depending on the order in which rows are updated:
UPDATE t SET id = id + 1;
For example, if the table contains 1 and 2 in the id
column and 1 is updated to 2
before 2 is updated to 3, an error occurs. To avoid this problem, add an ORDER BY
clause to cause the rows with larger id
values to be updated before those with
smaller values:
UPDATE t SET id = id + 1 ORDER BY id DESC;
You can also perform UPDATE
operations covering multiple tables. However, you cannot use ORDER BY
or LIMIT
with a multiple-table UPDATE
. The table_references
clause
lists the tables involved in the join. Its syntax is described in Section
13.2.9.2, "JOIN
Syntax". Here is an example:
UPDATE items,month SET items.price=month.priceWHERE items.id=month.id;
The preceding example shows an inner join that uses the comma operator, but multiple-table UPDATE
statements can use any type of join permitted in SELECT
statements, such as LEFT JOIN
.
If you use a multiple-table UPDATE
statement involving InnoDB
tables for which
there are foreign key constraints, the MySQL optimizer might process tables in an order that differs from that
of their parent/child relationship. In this case, the statement fails and rolls back. Instead, update a single
table and rely on the ON UPDATE
capabilities that InnoDB
provides to cause the other tables to be modified accordingly. See Section 5.4.5, "InnoDB
and FOREIGN KEY
Constraints".
Currently, you cannot update a table and select from the same table in a subquery.
Index hints (see Section
13.2.9.3, "Index Hint Syntax") are accepted but ignored for UPDATE
statements.
Prior to MySQL 5.6.6, an UPDATE
on a partitioned table using a storage engine such
as MyISAM
that employs table-level
locks locked all partitions of the table. This was true even for UPDATE ...
PARTITION
queries. (This did not and does not occur with storage engines such as InnoDB
that employ row-level locking.) In MySQL 5.6.6 and later, MySQL uses
partition lock pruning, so that only partitions containing rows matching the UPDATE
statement's WHERE
clause are actually locked, as long as none of the table's
partitioning columns are updated. For more information, see Section
18.6.4, "Partitioning and Locking".