1. 程式人生 > >【MySQL】REPLACE語法

【MySQL】REPLACE語法

定義

  REPLACE與INSERT類似,但是REPLACE在插入資料之前,如果新行的主鍵值或唯一索引列值與舊行相同,則會先刪除舊行,再插入新行。它是MySQL的專屬語法,是對SQL標準的擴充套件。

執行

MySQL會按照以下步驟來執行REPLACE語法:

  1. 嘗試插入新行。
  2. 如果發生主鍵或唯一索引重複錯誤,則從表中刪除具有重複鍵值的衝突行,再次嘗試插入新行。

返回

  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