场景:在日常的CURD中一定会用到批量新增。在我们的项目中,使用的数据库是Orcal,由于之前基本都是使用Mysql的,使用的sql语句也基本都是用mysql的。但是在这次的接口编写时用mysql的批量新增出了问题,刚开始我还以为是写的动态sql有问题,在后续的问题修改也主要是对动态sql修改,因此也浪费了大量的时间,在后续把sql搬到数据库运行一下后才发现是sql的问题,同时也了解到了mysql和orcal 也是有很多地方是不同的。
MySQL和Oracle在批量新增数据时存在一些不同点,主要体现在语法、性能、事务处理等方面。以下是一些关键区别:
1. 语法
MySQL:
在MySQL中,可以使用INSERT INTO ... VALUES
语句一次插入多行数据。示例如下:
INSERT INTO table_name (column1, column2, column3)
VALUES(value1, value2, value3),(value4, value5, value6),(value7, value8, value9);
Oracle:
在Oracle中,批量插入通常使用INSERT ALL
语句或使用多行的INSERT INTO ... SELECT
语句。示例如下:
INSERT ALLINTO table_name (column1, column2, column3) VALUES (value1, value2, value3)INTO table_name (column1, column2, column3) VALUES (value4, value5, value6)INTO table_name (column1, column2, column3) VALUES (value7, value8, value9)
SELECT * FROM dual;
或者使用INSERT INTO ... SELECT
语句:
INSERT INTO table_name (column1, column2, column3)
SELECT value1, value2, value3 FROM dual
UNION ALL
SELECT value4, value5, value6 FROM dual
UNION ALL
SELECT value7, value8, value9 FROM dual;
2. 性能
- MySQL:批量插入多行数据时,MySQL的性能通常比逐行插入要高,因为它减少了客户端与服务器之间的通信次数。
- Oracle:Oracle的批量插入性能也很高,尤其是在使用
INSERT ALL
语句时,因为它可以在一次操作中插入多行数据。
3. 事务处理
- MySQL:MySQL支持事务处理,批量插入的数据可以在一个事务中提交,确保数据的一致性。
- Oracle:Oracle也支持事务处理,并且提供了更强大的事务管理功能,允许更复杂的事务控制。
4. 特定功能
- MySQL:MySQL提供了
LOAD DATA INFILE
命令,用于从文件中快速批量插入数据,这是一个非常高效的方法。 - Oracle:Oracle提供了SQL*Loader和外部表(External Table)功能,用于从外部文件批量加载数据。这些工具在处理大规模数据插入时非常有用。
最后附上当时编写的sql代码和动态sql:
INSERT ALL
INTO PROD CONFIG GROUP(SERIAL NO,CONFIG GROUP ID,PRODUCT ID)
VALUES (12312',NULL,NULL)
INTO PROD CONFIG GROUP(SERIAL NO,CONFIG GROUP ID,PRODUCT ID)
VALUES ('1234',NULL,NULL)
SELECT I FROM DUAL ;
动态sql: