前言
在 PostgreSQL 中,我们推荐使用批量操作来进行插入,更新和删除数据,这样可以减少客户端与数据库的交互次数,进而提高数据库的吞吐量。
批量插入数据
1.使用insert into...select的方式
dbtest=# create table test(id serial, login varchar(10),time_now date);
CREATE TABLE
dbtest=# INSERT INTO test (id, login ,time_now) SELECT GENERATE_SERIES(1,10000),'dbtest',NOW();
INSERT 0 10000
dbtest=# select * from test limit 10;
id | login | time_now
----+--------+------------
1 | dbtest | 2022-01-11
2 | dbtest | 2022-01-11
3 | dbtest | 2022-01-11
4 | dbtest | 2022-01-11
5 | dbtest | 2022-01-11
6 | dbtest | 2022-01-11
7 | dbtest | 2022-01-11
8 | dbtest | 2022-01-11
9 | dbtest | 2022-01-11
10 | dbtest | 2022-01-11
(10 rows)
2.insert 后使用多个values
dbtest=# INSERT INTO test (id,login,time_now) VALUES (1001,'wanyix',NOW()), (1002,'wanyix',NOW()), (1003,'wanyix',NOW());
INSERT 0 3
3.copy 命令插入效率更高
简单的使用如下:
dbtest=# COPY test FROM stdin delimiter ',' csv header;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> 1006,liwangz,2022-01-11
>> 1007,mezhng,2022-01-11
>> \.
COPY 1
批量更新数据
我们可以使用 update 后加多个value的方式,示例如下:
dbtest=# UPDATE test SET login=tmp.login from (VALUES (1,'tianzhou'),(2,'tianzhou'),(6,'tianzhou')) AS tmp (id,login) WHERE test.id=tmp.id;
UPDATE 3
dbtest=# select * from test where id in(1,2,6);
id | login | time_now
----+----------+------------
1 | tianzhou | 2022-01-11
2 | tianzhou | 2022-01-11
6 | tianzhou | 2022-01-11
(3 rows)
批量删除数据
dbtest=# DELETE FROM test USING (VALUES (3),(4),(5)) AS tmp(id) WHERE test.id=tmp.id;
DELETE 3
如果您有删除全表的需求,请直接使用truncate 而不是delete。
如果您有其他问题,欢迎您联系火山引擎技术支持服务