openGauss2.0.0之Java测试Sequence
- 一、实验环境
- 二、实验目标
- 二、实验步骤
一、实验环境
项目 | Value |
---|---|
操作系统 | openEuler |
服务器 | 华为云弹性云服务器ECS 1 台 2核心 4GB内存 |
数据库 | openGauss2.0.0 单机部署 |
二、实验目标
-
目标
学习openGauss2.0.0的序列的使用,熟悉JDBC编程方式操作openGauss数据库
-
知识点
•Sequence是一个
存放等差数列
的特殊表
。这个表没有实际意义
,通常用于为行或者表生成唯一的标识符
。
•如果给出一个模式名,则该序列就在给定的模式中创建,否则会在当前模式中创建。序列名必须和同一个模式中的其他序列、表、索引、视图或外表的名称不同
。
•创建序列后,在表中使用序列的nextval()函数和generate_series(1,N)函数对表插入数据,请保证nextval的可调用次数大于等于N+1次,否则会因为generate_series()函数会调用N+1次而导致报错。序列Sequence是用来产生唯一整数的数据库对象
。序列的值是按照一定规则自增的整数。因为自增所以不重复,因此说Sequence具有唯一标识性。这也是Sequence常被用作主键的原因
。
通过序列使某字段成为唯一标识符的方法有两种:
1. 一种是声明字段的类型为序列整型,由数据库在后台自动创建一个对应的Sequence。
2. 另一种是使用CREATE SEQUENCE自定义一个新的Sequence,然后将nextval(‘sequence_name’)函数读取的序列值,指定为某一字段的默认值,这样该字段就可以作为唯一标识符。在Data Studio中查看序列,如下图所示:
序列默认:
最大值为:9223372036854775807
最小值为:1
自增步长为:1
开始值为:1
随着关联序列的数据库表的增加,last_value也会变化,记录数据库表中关联字段的最后一个数值。
二、实验步骤
-
前置步骤:
- openGauss已经正常安装到ECS服务器中了
-
在IDEA中创建工程,并把从官网下载下来的JDBC驱动包放入到该项目工程下的lib(需先创建)目录下,并将驱动包Add as liberary添加到工程中即可;项目工程如下:
-
编写程序,程序代码如下:
package com.opengauss.demo; import java.sql.*; import java.util.Properties; public class SequenceTest { public static void main(String[] args) throws SQLException { // 获取链接 Connection conn = getConnect("test001", "suben", "openGauss@1234"); // 可先保证数据库中不存在表和sequence // doBySQL(conn, 0, "drop table t5 cascade;"); // doBySQL(conn, 0, "drop sequence seq3 cascade;"); // 创建sequence doBySQL(conn, 0, "create sequence seq3;"); // 查看sequence System.out.println("=============创建时sequence中的内容如下============="); select(conn, "select * from seq3;",false,false); // 创建关联了sequence的表 doBySQL(conn, 0, "create table if not exists t5(id int not null default nextval('seq3'),name text);"); // 插入数据到表中 doBySQL(conn, 1, "insert into t5(name) values(?)"); // 查看数据表 select(conn,"select * from t5 order by id desc limit 3;",true,false); // 查看sequence System.out.println("=============关联数据表插入数据后,sequence中的内容如下============="); select(conn, "select * from seq3;",false,true); } public static Connection getConnect(String db, String user, String pwd) { String driver = "org.postgresql.Driver"; // 需要创建新的数据库用户,使用新的数据库用户连接 String sourceURL = "jdbc:postgresql://1xx.7x.x9.1x8:26000/" + db + "?"; Properties properties = new Properties(); properties.setProperty("user", user); properties.setProperty("password", pwd); Connection conn = null; try { Class.forName(driver); } catch (Exception var9) { var9.printStackTrace(); return null; } try { conn = DriverManager.getConnection(sourceURL, properties); System.out.println("连接成功! "); return conn; } catch (Exception var8) { var8.printStackTrace(); return null; } } public static void doBySQL(Connection conn, int flag, String sql) throws SQLException { Statement statement = conn.createStatement(); if (flag == 0) { statement.execute(sql); } else { conn.setAutoCommit(false); // 设置不自动提交 默认下是自动提交的 PreparedStatement prs = conn.prepareStatement(sql); for (int i = 1; i <= 20000; i++) { prs.setString(1, "第" + i + "次"); prs.addBatch(); // 将处理后的SQL都装在一个容器中 if (i % 500 == 0) { prs.executeBatch(); // 提交 prs.clearBatch(); // 清空容器 } conn.commit(); // 提交事务 } } } public static void select(Connection conn, String sql,boolean isTable,boolean isClosed) throws SQLException { PreparedStatement preparedStatement = conn.prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(); while (resultSet.next()) { if (isTable){ System.out.println( resultSet.getString(1) + "\t" + resultSet.getString(2)); }else { System.out.println( resultSet.getString(1) + "\t" + resultSet.getString(2) + "\t" + resultSet.getString(3) + "\t" + resultSet.getString(4) + "\t" + resultSet.getString(5)); } } if (isClosed){ if (preparedStatement != null) { preparedStatement.close(); } if (conn != null) { conn.close(); } } } }
-
运行程序,查看结果如下所示:
至此,单表关联序列的实验到此结束,大家可以尝试一个序列关联多张表的时候,会发生什么呢?欢迎大家自行实验后,给留言,分享你们的测试结果和测试结论。如果您觉得有用,可点赞可转发给身边的朋友,大共同成长!!