Syntax:
REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    { {VALUES | VALUE} (value_list) [, (value_list)] ...
      |
      VALUES row_constructor_list
    }

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    SET assignment_list

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name
    [PARTITION (partition_name [, partition_name] ...)]
    [(col_name [, col_name] ...)]
    {SELECT ... | TABLE table_name}

value:
    {expr | DEFAULT}

value_list:
    value [, value] ...

row_constructor_list:
    ROW(value_list)[, ROW(value_list)][, ...]

assignment:
    col_name = value

assignment_list:
    assignment [, assignment] ...

REPLACE works exactly like INSERT, except that if an old row in the
table has the same value as a new row for a PRIMARY KEY or a UNIQUE
index, the old row is deleted before the new row is inserted. See [HELP
INSERT].

REPLACE is a MySQL extension to the SQL standard. It either inserts, or
deletes and inserts. For another MySQL extension to standard SQL---that
either inserts or updates---see
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html.

DELAYED inserts and replaces were deprecated in MySQL 5.6. In MySQL
8.0, DELAYED is not supported. The server recognizes but ignores the
DELAYED keyword, handles the replace as a nondelayed replace, and
generates an ER_WARN_LEGACY_SYNTAX_CONVERTED warning: REPLACE DELAYED
is no longer supported. The statement was converted to REPLACE. The
DELAYED keyword is scheduled for removal in a future release. release.

*Note*:

REPLACE makes sense only if a table has a PRIMARY KEY or UNIQUE index.
Otherwise, 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 cannot refer to values from the current
row and use them in the new row. If you use an assignment such as SET
col_name = col_name + 1, the reference to the column name on the right
hand side is treated as DEFAULT(col_name), so the assignment is
equivalent to SET col_name = DEFAULT(col_name) + 1.

In MySQL 8.0.19 and later, you can specify the column values that
REPLACE attempts to insert using VALUES ROW().

To use REPLACE, you must have both the INSERT and DELETE privileges for
the table.

If a generated column is replaced explicitly, the only permitted value
is DEFAULT. For information about generated columns, see
https://dev.mysql.com/doc/refman/8.0/en/create-table-generated-columns.
html.

REPLACE supports explicit partition selection using the PARTITION
clause with a list of comma-separated names of partitions,
subpartitions, or both. As with INSERT, if it is not possible to insert
the new row into any of these partitions or subpartitions, the REPLACE
statement fails with the error Found a row not matching the given
partition set. For more information and examples, see
https://dev.mysql.com/doc/refman/8.0/en/partitioning-selection.html.

URL: https://dev.mysql.com/doc/refman/8.0/en/replace.html

