【MySQL】REPLACE語法
阿新 • • 發佈:2019-02-02
定義
REPLACE與INSERT類似,但是REPLACE在插入資料之前,如果新行的主鍵值或唯一索引列值與舊行相同,則會先刪除舊行,再插入新行。它是MySQL的專屬語法,是對SQL標準的擴充套件。
執行
MySQL會按照以下步驟來執行REPLACE語法:
- 嘗試插入新行。
- 如果發生主鍵或唯一索引重複錯誤,則從表中刪除具有重複鍵值的衝突行,再次嘗試插入新行。
返回
REPLACE語句返回的受影響行數,是刪除和插入的行的總和。
意義
REPLACE只有在表中有主鍵或者唯一索引時才有意義。否則,它就等價於INSERT。
示例
建立表:
CREATE TABLE test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data VARCHAR(64) DEFAULT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);
執行REPLACE語句:
mysql> REPLACE INTO test VALUES (1, 'Old', '2018-07-01 18:47:00');
Query OK, 1 row affected
mysql> REPLACE INTO test VALUES (1, 'New' , '2018-07-01 18:47:42');
Query OK, 2 rows affected
mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts |
+----+------+---------------------+
| 1 | New | 2018-07-01 18:47:42 |
+----+------+---------------------+
1 row in set
現在,我們再建立一張表,與第一張表類似,不過,這次主鍵覆蓋兩列:
CREATE TABLE test2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
data VARCHAR(64) DEFAULT NULL,
ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id, ts)
);
執行REPLACE語句:
mysql> REPLACE INTO test2 VALUES (1, 'Old', '2018-07-01 18:47:00');
Query OK, 1 row affected
mysql> REPLACE INTO test2 VALUES (1, 'New', '2018-07-01 18:47:42');
Query OK, 1 row affected
mysql> SELECT * FROM test2;
+----+------+---------------------+
| id | data | ts |
+----+------+---------------------+
| 1 | Old | 2018-07-01 18:47:00 |
| 1 | New | 2018-07-01 18:47:42 |
+----+------+---------------------+
2 rows in set
這次是插入而不是替換的原因:主鍵覆蓋id和ts兩個列,新行與舊行ts列值不同,即主鍵值不同,不替換。
參考資料:https://dev.mysql.com/doc/refman/8.0/en/replace.html