Listening to the Words

TH5中的数据库插入操作如何调起Replace Into操作

MySql中批量更新的方法:

最近公司的项目需要对数据量几十万的商品库进行更新,考虑到更新数据需要查询在更新的过程势必对性能造成巨大的影响,因此研究了以下的方法:

replace into 批量更新

我们来看一下使用REPLACE语句来更好地了解它的工作原理的例子。
首先,创建一个名为cities的新表,如下所示:

USE testdb;

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

接下来,在cities表中插入一些行记录:

INSERT INTO cities(name,population)
VALUES('New York',8008278),
   ('Los Angeles',3694825),
   ('Shanghai',1923400);

下面查询cities表中的数据,以验证插入操作-

mysql> SELECT * FROM cities;
+----+-------------+------------+
| id | name        | population |
+----+-------------+------------+
|  1 | New York    |    8008278 |
|  2 | Los Angeles |    3694825 |
|  3 | Shanghai    |    1923400 |
+----+-------------+------------+
3 rows in set

使用REPLACE声明将洛杉矶市的人口更新为3696820。

REPLACE INTO cities(id,population) VALUES(2,3696820);
Query OK, 2 rows affected

上面执行返回结果中提示:2 rows affected,说明有两行数据受影响。

最后,再次查询城市表的数据来验证替换的结果。

mysql> SELECT  * FROM  cities;
+----+----------+------------+
| id | name     | population |
+----+----------+------------+
|  1 | New York |    1008256 |
|  2 | NULL     |    3696820 |
|  3 | Shanghai |    1923400 |
+----+----------+------------+
3 rows in set

REPLACE语句的工作原理如下

REPLACE语句首先使用列列表提供的信息将新行插入到cities表中。但是插入失败,因为在cities表中已经存在ID2的行记录,因此,MySQL引发了重复键错误。
然后,REPLACE语句更新具有id列值为2指定的行记录。在正常进程中,它将先删除具有冲突id2的旧行,然后插入一个新行。

MySQL REPLACE和INSERT的区别

REPLACE语句的第一种形式类似于INSERT语句,除了INSERT关键字换成REPLACE关键字以外,如下所示:

REPLACE INTO table_name(column_list)
VALUES(value_list);

例如,如果要在cities表中插入新行,请使用以下查询:

REPLACE INTO cities(name,population)
VALUES('Phoenix',1321523);

请注意,没有出现在REPLACE语句中的列将使用默认值插入相应的列。 如果列具有NOT NULL属性并且没有默认值,并且您如果没有在REPLACE语句中指定该值,则MySQL将引发错误。这是REPLACE和INSERT语句之间的区别。

使用REPLACE语句时需要知道几个重点:

如果您开发的应用程序不仅支持MySQL数据库,而且还支持其他关系数据库管理系统(RDBMS),则应避免使用REPLACE语句,因为其他RDBMS可能不支持。代替的作法是在事务中使用DELETE和INSERT语句的组合。

  • 如果在具有触发器的表中使用了REPLACE语句,并且发生了重复键错误的删除,则触发器将按以下顺序触发:在删除前删除,删除之后,删除后
  • 如果REPLACE语句删除当前 行并插入新行
  • 如果REPLACE语句更新当前行,则触发BEFORE UPDATE和AFTER UPDATE触发器

ThinkPHP5中如何使用replace into方法

thinkphp/library/think/db/Query.php
再tp5的查询类中提供了批量插入方法:

//这是查询构造器方法,orm(模型)没有提供此方法
db('tk_test')->insertAll($sql,true);//将第二个参数设置为true就是replace into

tips: thinkphp 5.0.10 才支持insertAll方法支持replace参数

点赞