PostgreSQL或高斯批量导入,序号自增

PostgreSQL大数据导入:使用序列与CopyManager,
本文介绍了如何在PostgreSQL中处理大量数据导入,包括创建序列、绑定到字段以实现自增,以及使用CopyManager方法以流方式导入文件,示例了导入一千两百万条数据的时间和过程。

近期有个项目需要导入一千两百多万条数据,文件内容是每列以27的ascill值作为间隔符。把ascill转java如下:

假设表名是test_imp,要导入的字段有custno、custname、accno,要作为序号的字段名为seqno。文件内容格式:

           

一、在数据库建个序列:

     create sequence test_imp_seq;

二、将该序列绑定到你要导入的表的那个字段,这样导入的时候每行数据序号字段值就会自动+1:

     alter table test_imp alter column seqno set default nextval('test_imp_seq');

这样导入的时候就会自动序号自增了,当然,如果你要是想每次导入序号都从1开始,那么就在导入前可以执行下这个sql:

     select setval('test_imp_seq',1,false);//false的意思是下一次nextval将返回该数值,随后的nextval才开始递增该序列,意思是设置为1,那么下次序号会是1开始,不加的话序号会是2开始。

三、导入

接下来就是具体导入了,导入的代码网上有很多,而我用的是postgresql驱动包的copyManager方法,将文件以流的方式入库,方法网上百度下就知道了,导入虽然不是我本次要说的内容,不过还是大致写下供参考(纯手敲的,敲错单词多担待):

Connection conn = null;
CopyManager copyManager = null;
BufferedReader br = null;

//获取连接,这个网上一大堆
conn = GaussDBUtil.getDBConnection();

//判断当前连接是不是PG连接
if(conn.isWrapperFor(PGConnection.class)){
  
  System.out.println("PG连接");
  //定义表信息
  String tablename = "test_imp(custno,custname,accno)";

  conn = (Connection) conn.unwrap(PGConnection.class);

  copyManager = new copyManager ((BaseConnection)conn);

  br = new BufferedReader (new InputStreamReader(new FileInputStream("/home/test/test.txt"),"UTF-8"));

  copyManager.copyIn("COPY "+tablename + " FROM STDIN delimiter as '"+(char)(27)+"' NULL as 'null'",br);

  br.close();//释放资源
  GaussDBUtil.close(conn);//关闭连接,这个方法同样也是网上一大堆

}

经我本机真实测试,导入一千二百多万数据(每行32个字段,即32列)需二十分钟左右。

觉得有帮助到你的朋友点个赞哟(^U^)ノ~YO

### 高斯数据库序号实现方式 高斯数据库GaussDB)作为华为推出的企业级关系型数据库,支持标准SQL以及一些扩展功能。在高斯数据库中,可以使用序列(Sequence)对象来实现序号的自功能[^1]。此外,也可以参考其他数据库系统如MySQL和PostgreSQL的相关实现机制,结合高斯数据库的特点进行应用。 #### 使用序列对象实现序号高斯数据库中,可以通过创建序列对象并将其与表中的列关联来实现序号。以下是具体实现方法: 1. **创建序列对象** 创建一个序列对象时,可以指定起始值、步长等参数。例如: ```sql CREATE SEQUENCE test_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE CACHE 1; ``` 上述语句定义了一个名为`test_seq`的序列对象,起始值为1,每次递1,并且没有最大值限制[^1]。 2. **将序列与表列关联** 在插入数据时,可以使用`NEXTVAL`函数从序列中获取下一个值,并将其赋值给表中的列。例如: ```sql INSERT INTO stu (id, name) VALUES (NEXTVAL('test_seq'), 'Alice'); ``` 这样,每次插入新记录时,`id`列都会自动使用序列生成的唯一值[^1]。 3. **批量导入时设置序列值** 如果需要在批量导入数据后重新调整序列值,可以使用`SETVAL`函数。例如: ```sql SELECT SETVAL('test_seq', 1, FALSE); ``` 上述语句将序列`test_seq`的当前值设置为1,并确保下一次调用`NEXTVAL`时返回该值[^4]。 #### 其他实现方式 除了使用序列对象外,还可以通过以下方式实现序号: 1. **主键约束与自** 类似于MySQL的`AUTO_INCREMENT`机制,高斯数据库也支持在创建表时定义主键并设置自属性。例如: ```sql CREATE TABLE stu ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) ); ``` 插入数据时,如果将`id`列设置为`NULL`,则会自动为其分配一个唯一的递值[^3]。 2. **查询时动态生成序号** 如果仅需要在查询结果中添加序号列,而无需存储在表中,可以使用窗口函数如`ROW_NUMBER()`。例如: ```sql SELECT ROW_NUMBER() OVER (ORDER BY Convey_Fee DESC) AS z, * FROM table_name; ``` 上述语句会在查询结果中为每一行生成一个唯一的序号列[^5]。 #### 注意事项 - 在事务回滚的情况下,序列生成的值可能不会回退,从而导致跳号现象。如果业务场景要求严格避免跳号,建议采用手动控制的方式,例如通过表存储当前最大值并加锁操作[^2]。 - 序列对象适用于大多数需要唯一标识符的场景,但在高并发环境下可能需要额外考虑性能优化。 ```sql -- 示例:创建表并使用序列生成唯一ID CREATE SEQUENCE seq_id START WITH 1 INCREMENT BY 1 NO MAXVALUE CACHE 1; CREATE TABLE orders ( order_id INT PRIMARY KEY, order_details TEXT ); INSERT INTO orders (order_id, order_details) VALUES (NEXTVAL('seq_id'), 'Sample Order'); ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值