在本教程中,您將學習如何使用 MySQL的REPLACE
語句來插入或更新數據庫表中的數據。html
MySQL的REPLACE語句是一個MySQL擴展於SQL標準的語句。 MySQL REPLACE語句的工做原理以下:mysql
要肯定新行是否已經存在於表中,MySQL使用PRIMARY KEY或惟一鍵( UNIQUE KEY
)索引。若是表中沒有使用一個索引,REPLACE
語句至關於INSERT語句。sql
要使用MySQL REPLACE
語句,至少須要有插入和刪除權限。數據庫
請注意,MySQL 中也有一個名稱爲 REPLACE()函數,它不是在本教程中所說的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
語句的工做原理以下:
REPLACE
語句首先按語句中的列表中提供的值插入新行到 city 表。但插入失敗,由於城市ID爲2的數據記錄在 city 表中已經存在,所以,MySQL引起重複鍵錯誤。REPLACE
語句而後將一個使用ID字段值指定的行記錄更新,由於沒有指定 name 字段的值,因此它使用了該列的默認值。在正常的執行過程當中,它會先刪除衝突ID的舊行,而後插入一個新行。可是在這裏咱們知道,REPLACE語句並無刪除舊行再插入新行,由於這裏 id 列的值是 2,而不是 4。
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
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查詢後,獲得如下結果 -
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;
如下幾個重要的地方在使用REPLACE語句您須要知道:
BEFORE INSERT
BEFORE DELETE
, AFTER DELETE
, AFTER INSERT
在 REPLACE 語句刪除當前行並插入新行。當REPLACE語句更新當前行BEFORE UPDATE和AFTER UPDATE觸發器被觸發。在本教程中,你已經學會了使用不一樣形式的 MySQL REPLACE語句來在表中插入或更新數據。