pgsql -- 批量插入

本文介绍了使用Mybatis在PgSQL中进行批量插入数据的方法,包括通过Set集合、List集合和Map进行操作。详细展示了不同场景下的DAO层代码和SQL语句,参照了pgsql官方文档。

工具:mybatis+pgsql

详见pgsql官方文档

案例1 – Set集合

dao层

void insert(Set<User> userSet);

sql

<insert id = "insert" parameterType = "java.util.Set">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="collection" separator="," item="val">
	(#{val.username}, #{val.address},#{val.sex},now())
	</foreach>
</insert>

案例2 – List集合

dao层

void insert(List<User> userList);

sql

<insert id = "insert" parameterType="java.util.List">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="list" separator="," item="val">
	(#{val.username}, #{val.address},#{val.sex},now())
	</foreach>
</insert>

sql的parameterType也可以省略不写,如下案例

dao层

void insert(List<User> userList);

sql

<insert id = "insert">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="list" separator="," item="val">
	(#{val.username}, #{val.address},#{val.sex},now())
	</foreach>
</insert>

sql的collection值默认是collection/list,如下案例

dao层

void insert(List<User> userList);

sql

<insert id = "insert">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="collection" separator="," item="val">
	(#{val.username}, #{val.address},#{val.sex},now())
	</foreach>
</insert>

sql

<insert id = "insert">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="list" separator="," item="val">
	(#{val.username}, #{val.address},#{val.sex},now())
	</foreach>
</insert>

sql的collection值也可以自定义,通过@Param注解实现。如下案例

dao层

void insert(@Param("userList")List<User> userList);

sql

<insert id = "insert">
	insert into user(username,address,sex,create_date)
	values
	<foreach collection="userList" separator="," item="user">
	(#{user.username}, #{user.address},#{user.sex},now())
	</foreach>
</insert>

案例3 – Map

dao层

void insert(@param("depId") String depId,
            @Param("userList") List<User> userList);

sql

<insert id = "insert" parameterType="java.util.HashMap">
	insert into user(username,address,depId,create_date)
	values
	<foreach collection="userList" separator="," item="user">
	(#{user.username}, #{user.address},#{depId},now())
	</foreach>
</insert>
<think> 我们被要求回答关于PostgreSQL批量插入据的方法。根据提供的引用,我们可以总结出几种方法: 1. 直接使用INSERT语句插入多个值(引用1) 2. 通过从另一个表查询来插入(引用1) 3. 使用脚本生成批量据并插入(引用4) 另外,引用2和3提到了使用Python脚本和据类型匹配的问题,但这不是直接的插入方法,而是实现批量插入的工具和注意事项。 因此,我们可以这样组织回答: 首先介绍最常用的两种方法:多值INSERT和INSERT...SELECT,然后介绍使用generate_series函生成测试据的方法(因为引用4提供了一个例子)。 注意:用户可能不仅仅是想插入测试据,也可能是从其他表导入据,所以我们需要区分场景。 另外,引用3提到据类型匹配的问题,虽然用户没有直接问,但作为注意事项可以提及。 回答结构: 1. 多值插入(适合手动或少量据) 2. 从另一个表插入(适合据迁移或表复制) 3. 使用generate_series函生成批量据(适合生成测试据) 4. 使用编程语言(如Python)批量插入(适合从应用层插入) 注意:引用2提到了Python脚本,我们可以简单提一下,但不需要给出具体代码(除非用户要求),因为用户的问题是“方法”。 根据引用2,使用Python进行批量插入比较简单,我们可以提到使用psycopg2库的execute_values或copy_from等方法。 因此,我们总结四种方法,并给出示例(使用引用中的例子)和注意事项。 由于引用3提到了据类型问题,我们可以在注意事项中说明。 最后,生成相关问题。 </think> ### PostgreSQL 批量插入据的方法 PostgreSQL 提供多种高效批量插入据的方式,以下是核心方法及示例: #### 1. **多值插入 (Multi-VALUES)** 最基础的批量插入方式,单条`INSERT`语句插入多行据: ```sql INSERT INTO 表名 (列1, 列2, ...) VALUES ('值A1', '值A2', ...), ('值B1', '值B2', ...), ... ; -- 最多可插入千行 ``` **示例**:插入两部电影据 ```sql INSERT INTO films (code, title, did, date_prod, kind) VALUES ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'), ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); [^1] ``` #### 2. **从其他表导入 (INSERT...SELECT)** 将查询结果批量插入目标表,适合表间据迁移: ```sql INSERT INTO 目标表 (列1, 列2, ...) SELECT 列1, 列2, ... FROM 源表 WHERE 条件; -- 支持复杂查询 ``` **示例**:从`sheet2`迁移据到`sheet1` ```sql INSERT INTO db.sheet1 SELECT * FROM db.sheet2; [^1] ``` #### 3. **动态生成测试据 (generate_series)** 使用内置函生成序列据,快速构建测试据集: ```sql INSERT INTO 表名 (列1, 列2, ...) SELECT generate_series(起始值, 结束值), -- 生成序列字 随机函, -- 如random() 其他生成函... ; ``` **示例**:生成500万条测试据 ```sql INSERT INTO t_test SELECT generate_series(1,5000000) as key, repeat(chr(int4(random()*26)+65),4), -- 随机4字母字符串 (random()*(6^2))::integer, -- 随机整 null, (random()*(10^4))::integer; [^4] ``` #### 4. **编程语言批量提交** 通过应用层批量打包据提交(Python示例): ```python import psycopg2 data = [('A1', 100), ('A2', 200), ...] # 批量据集 conn = psycopg2.connect(database="test") cur = conn.cursor() cur.executemany("INSERT INTO table VALUES (%s,%s)", data) # 批量执行 conn.commit() [^2] ``` ### 📌 注意事项 1. **据类型匹配**:源据与目标列类型需严格匹配,如避免将`bigint`误插入`varchar`列[^3] 2. **事务控制**:默认每条`INSERT`作为独立事务,建议显式启用事务块: ```sql BEGIN; -- 开启事务 INSERT...; -- 批量操作 COMMIT; -- 统一提交 ``` 3. **性能优化**: - 万级以上据优先选用`COPY`命令或`INSERT...SELECT` - 关闭索引/触发器后再批量插入,完成后重建 --- ### 相关问题 1. 如何验证PostgreSQL批量插入后的据一致性? 2. 使用`COPY`命令与`INSERT`批量插入的性能差异有哪些? 3. 批量插入时遇到主键冲突应如何处理? 4. 如何监控PostgreSQL大批量插入时的内存和I/O消耗? [^1]: 基础批量插入语法参考 [^2]: Python实现批量插入示例 [^3]: 据类型匹配注意事项 [^4]: 动态生成测试据方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值