# Duplicate Row Errors

__*ON DUPLICATE KEY UPDATE*__
__*Handling duplicated PK*__

+ `INSERT ... ON DUPLICATE KEY UPDATE`: Avoid duplicate row records errors
+ Similar to REPLACE, but uses UPDATE instead of DELETE to handle duplicate row records

```8
tidb> SELECT * FROM test.r1;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | Z    | F      |
|  2 | Z    | F      |
+----+------+--------+
2 rows in set (0.00 sec)

tidb> REPLACE INTO test.r1 (id, name) VALUES (1, 'A');
Query OK, ~!@2 rows@!~ affected (0.00 sec)

tidb> INSERT INTO test.r1 (id, name) VALUES (2, 'B') ~!@ON DUPLICATE KEY UPDATE@!~ name ='B';
Query OK, 2 rows affected (0.01 sec)

tidb> SELECT * FROM test.r1;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | A    | ~!@NULL@!~   |
|  2 | B    | ~!@F@!~      |
+----+------+--------+
2 rows in set (0.00 sec)
```
------------------------------------------------------------

```
tidb> SELECT * FROM test.r1;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | Z    | F      |
|  2 | Z    | F      |
+----+------+--------+
2 rows in set (0.00 sec)

tidb> REPLACE INTO test.r1 (id, name) VALUES (1, 'A');
Query OK, 2 rows affected (0.01 sec)

tidb> SELECT * FROM test.r1;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | A    | NULL   |
|  2 | Z    | F      |
+----+------+--------+
2 rows in set (0.00 sec)

tidb> INSERT INTO test.r1 (id, name) VALUES (2, 'B') ON DUPLICATE KEY UPDATE name ='B';
Query OK, 2 rows affected (0.01 sec)

tidb> SELECT * FROM test.r1;
+----+------+--------+
| id | name | gender |
+----+------+--------+
|  1 | A    | NULL   |
|  2 | B    | F      |
+----+------+--------+
2 rows in set (0.00 sec)
```
