在本教程中,您将学习如何使用 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语句来在表中插入或更新数据。