:: DEVELOPER ZONE
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
Or:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
Or:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
SELECT ...
REPLACE works exactly like
INSERT, except that if an old record in the table
has the same value as a new record for a PRIMARY
KEY or a UNIQUE index, the old record
is deleted before the new record is inserted. See
Section 13.2.4, “INSERT Syntax”.
Note that unless the table has a PRIMARY KEY or
UNIQUE index, using a REPLACE
statement makes no sense. It becomes equivalent to
INSERT, because there is no index to be used to
determine whether a new row duplicates another.
Values for all columns are taken from the values specified in the
REPLACE statement. Any missing columns are set to
their default values, just as happens for INSERT.
You can't refer to values from the current row and use them in the
new row. If you use an assignment such as SET
, the reference to
the column name on the right hand side is treated as
col_name =
col_name + 1DEFAULT(, so
the assignment is equivalent to col_name)SET
.
col_name =
DEFAULT(col_name) + 1
To be able to use REPLACE, you must have
INSERT and DELETE privileges
for the table.
The REPLACE statement returns a count to indicate
the number of rows affected. This is the sum of the rows deleted and
inserted. If the count is 1 for a single-row
REPLACE, a row was inserted and no rows were
deleted. If the count is greater than 1, one or more old rows were
deleted before the new row was inserted. It is possible for a single
row to replace more than one old row if the table contains multiple
unique indexes and the new row duplicates values for different old
rows in different unique indexes.
The affected-rows count makes it easy to determine whether
REPLACE only added a row or whether it also
replaced any rows: Check whether the count is 1 (added) or greater
(replaced).
If you are using the C API, the affected-rows count can be obtained
using the mysql_affected_rows() function.
Currently, you cannot replace into a table and select from the same table in a subquery.
Here follows in more detail the algorithm that is used (it is also
used with LOAD DATA ... REPLACE):
Try to insert the new row into the table
While the insertion fails because a duplicate-key error occurs for a primary or unique key:
Delete from the table the conflicting row that has the duplicate key value
Try again to insert the new row into the table
© 1995-2005 MySQL AB. All rights reserved.

User Comments
Warning: query failed: Unknown column 'user.firstname' in 'field list' in /data0/sites/live/web-main/lib/mysql-cxn.php on line 69
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /data0/sites/live/web-main/lib/docbook.php on line 245
Add your own comment.