MySQL Replace語句

在本教程中,您將學習如何使用 MySQL的REPLACE語句來插入或更新數據庫表中的數據。html

MySQL REPLACE語句介紹

MySQL的REPLACE語句是一個MySQL擴展於SQL標準的語句。 MySQL REPLACE語句的工做原理以下:mysql

  • 若是新行已經存在,MySQL的REPLACE  語句插入一個新行
  • 若是新行不存在,則REPLACE  語句首先刪除舊的行,而後插入一個新行。在某些狀況下,REPLACE  語句只更新現有行; 

要肯定新行是否已經存在於表中,MySQL使用PRIMARY KEY或惟一鍵( UNIQUE KEY)索引。若是表中沒有使用一個索引,REPLACE  語句至關於INSERT語句sql

要使用MySQL REPLACE 語句,至少須要有插入和刪除權限。數據庫

請注意,MySQL 中也有一個名稱爲 REPLACE()函數,它不是在本教程中所說的REPLACE語句。函數

MySQL REPLACE語句示例

讓咱們來看看如何使用REPLACE語句,這裏使用一個例子以方便咱們更好的理解它是如何工做。學習

首先,建立一個新表 city ,其定義語句以下:spa

CREATE TABLE studymysql.city(
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    population INT NOT NULL
);

接下來,插入一些行 數據到 city 表:code

INSERT INTO  studymysql.city(name,population)
VALUES('上海', 18008278),
  ('廣州',13694825),
  ('深圳',11223405);

咱們從 city 表中查詢數據,以驗證插入操做。htm

SELECT * FROM  studymysql.city;

執行上面的查詢,結果以下所示 - 教程

能夠看到,在 city 表中有插入了三個城市。

而後,假設要更新廣州市的人口爲 11008256。咱們可使用 UPDATE語句以下:

UPDATE  studymysql.city
SET
    population=11008256
WHERE
    id=2;

咱們執行上面的查詢以驗證更新結果,結果以下所示 - 

SELECT  * FROM studymysql.city;

如預期的那樣,UPDATE語句已經更新了數據。

在此以後,使用REPLACE語句將廣州市的人口更新爲 13696820。

REPLACE INTO studymysql.city(id,population)
VALUES(2, 13696820);

最後,再次查詢 city 表中的數據驗證執行的結果。

SELECT  * FROM studymysql.city;

執行上面的查詢,結果以下所示 - 

城市ID爲2的 name 列的值如今是 NULL 。您可能會想到這個 name 列的值保持不變。然而,REPLACE 語句並不像想象的那樣。在這種狀況下,REPLACE 語句的工做原理以下:

  1. REPLACE 語句首先按語句中的列表中提供的值插入新行到 city 表。但插入失敗,由於城市ID爲2的數據記錄在 city 表中已經存在,所以,MySQL引起重複鍵錯誤。
  2. REPLACE 語句而後將一個使用ID字段值指定的行記錄更新,由於沒有指定 name 字段的值,因此它使用了該列的默認值。在正常的執行過程當中,它會先刪除衝突ID的舊行,而後插入一個新行。

可是在這裏咱們知道,REPLACE語句並無刪除舊行再插入新行,由於這裏 id 列的值是 2,而不是 4。

MySQL REPLACE 和 INSERT語句

REPLACE語句的第一種形式是相似INSERT 語句,除了關鍵字 INSERT 被替換 REPLACE 關鍵字以下:

REPLACE INTO table_name(column_list)
VALUES(value_list);

例如,若是想插入新行到 city 表中,可使用下面的查詢:

REPLACE INTO studymysql.city(name,population)
VALUES('海口', 1321523);

注意,REPLACE語句沒有出現用於插入到相應列的列默認值。若是它是一個 NOT NULL屬性並無提供一個默認值,在REPLACE語句不指定列的值,MySQL將引起一個錯誤。這是REPLACE 和INSERT語句之間的差別。 

例如,在下面的語句中,咱們僅指定name 列的值,但不指定 population  列的值。 MySQL將會引起錯誤消息。

因爲population 列不接受 NULL 值,在定義 citie表結構時,咱們沒有爲 population  指定一個默認值。

REPLACE INTO studymysql.city(name) VALUES('杭州');

這是 MySQL 發出的錯誤信息:

21:59:21    REPLACE INTO studymysql.city(name) VALUES('杭州')    Error Code: 1364. Field 'population' doesn't have a default value    0.000 sec

MySQL REPLACE 和UPDATE

REPLACE語句的第二種形式相似於UPDATE 語句以下:

REPLACE INTO table
SET column1=value1,
    column2=value2;

請注意,在REPLACE語句中沒有WHERE子句

例如,若是想要將 海口 的人口更新爲 1768980,您可使用以下REPLACE語句: 

REPLACE INTO studymysql.city
SET id=4,
    name='海口',
    population=1768980;

不一樣於UPDATE 語句,若是不指定 SET 子句中的列對應的值,REPLACE 語句將使用該列的默認值。

SELECT  * FROM studymysql.city;

執行上面的SQL查詢後,獲得如下結果 - 

MySQL REPLACE INTO 和 SELECT

REPLACE 語句的第三種形式相似 INSERT INTO SELECT語句

REPLACE INTO table_1(column_list)
SELECT column_list
FROM table_2
WHERE where_condition;

假設,要複製城市編號是1  的信息,使用REPLACE INTO SELECT語句,以下面的查詢:

REPLACE INTO studymysql.city(name,population)
SELECT name,population FROM studymysql.city
WHERE id=1;

MySQL REPLACE語句用法

如下幾個重要的地方在使用REPLACE語句您須要知道:

  • 若是您開發不只要支持MySQL數據庫,還包括其餘關係數據庫管理系統(RDBMS)的應用程序,應該避免使用REPLACE語句,由於其餘RDBMS可能不支持它。 能夠在一個事務中使用 DELETE 和 INSERT 語句的組合。
  • 若是使用REPLACE語句在有觸發器而且有重複鍵錯誤發生時,觸發器將在下列順序自動刪除表中數據:BEFORE INSERT  BEFORE DELETE , AFTER DELETE , AFTER INSERT 在 REPLACE 語句刪除當前行並插入新行。當REPLACE語句更新當前行BEFORE UPDATE和AFTER UPDATE觸發器被觸發。

在本教程中,你已經學會了使用不一樣形式的 MySQL REPLACE語句來在表中插入或更新數據。

相關文章
相關標籤/搜索