1. 程式人生 > 其它 >MySQL REPLACE INTO語句

MySQL REPLACE INTO語句

介紹

在向表中插入資料時,我們經常會:首先判斷資料是否存在;如果不存在,則插入;如果存在,則更新。

但在 MySQL 中有更簡單的方法,replace into(insert into 的增強版),當表中的舊行與 PRIMARY KEY或 UNIQUE 索引的新行具有相同的值,則在插入新行之前刪除舊行,否則只就新增插入。

REPLACE 它的工作方式與 INSERT 完全相同,它是 SQL 標準的 MySQL 擴充套件。它要麼插入,要麼刪除和插入。

REPLACE僅當表具有PRIMARY KEY或 UNIQUE索引時才有意義。否則,它就等於INSERT,因為沒有索引可用於確定新行是否與另一行重複。

要使用 REPLACE,必須同時擁有表的INSERT和 DELETE許可權。

REPLACE INTO用法

作用
當表中的舊行與 PRIMARY KEY或 UNIQUE 索引的新行具有相同的值,則在插入新行之前刪除舊行,否則就只新增插入。

語法

REPLACE INTO 表名 (欄位名, ...)  values(欄位值, ...);

insert into 和 replace into 的區別

使用 insert into時,當表中的舊行與 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,就會插入失敗。

而使用 replace into,會完成記錄替換。

示例

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)
);

建立 test 表,執行以下語句:

mysql> REPLACE INTO test VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.04 sec)

mysql> REPLACE INTO test VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 2 rows affected (0.04 sec)

mysql> SELECT * FROM test;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
1 row in set (0.00 sec)

建立第二張表與第一張表幾乎相同,但主鍵現在是覆蓋兩列,如下所示:

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)
);

當我們在test表上執行test2相同的兩個REPLACE語句時,我們得到了不同的結果:

mysql> REPLACE INTO test2 VALUES (1, 'Old', '2014-08-20 18:47:00');
Query OK, 1 row affected (0.05 sec)

mysql> REPLACE INTO test2 VALUES (1, 'New', '2014-08-20 18:47:42');
Query OK, 1 row affected (0.06 sec)

mysql> SELECT * FROM test2;
+----+------+---------------------+
| id | data | ts                  |
+----+------+---------------------+
|  1 | Old  | 2014-08-20 18:47:00 |
|  1 | New  | 2014-08-20 18:47:42 |
+----+------+---------------------+
2 rows in set (0.00 sec)

這是因為,當執行 REPLACE INTO 時,test2表中,列值id和ts列值,必須與要替換行的現有行的值進行相匹配;否則,插入一行。