返回首页

gbase数据、南大通用产品文档:GBase8a获取AUTO_INCREMENT 列值方法

更新日期:2024年09月11日

本示例实现了使用可更新结果集获取AUTO_INCREMENT 列的值。
示例如下:
package com.gbase.jdbc.simple;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司

- 151 -
import java.sql.SQLException;
import java.sql.Statement;

public class SampleUpdatableResultSet {



private
static
final
String
URL
=
"jdbc:gbase://192.168.111.95:5258/test?user=sysdba&password=";



public static void main(String[] args) {


try {



(new SampleUpdatableResultSet()).test();


} catch (Exception ex) {



}

}


public void test() throws Exception {


Connection conn = null;


try {



Class.forName("com.gbase.jdbc.Driver").newInstance();



conn = DriverManager





.getConnection(URL);




Statement stmt = null;



ResultSet rs = null;



try {








stmt = conn.createStatement(






java.sql.ResultSet.TYPE_FORWARD_ONLY,






java.sql.ResultSet.CONCUR_UPDATABLE);









// 创建表




stmt.executeUpdate("DROP
TABLE
IF
EXISTS

GBase 8a 程序员手册JDBC 篇


- 152 -

南大通用数据技术股份有限公司
autoIncTutorial");




stmt.executeUpdate("CREATE TABLE autoIncTutorial ("






+ "priKey INT NOT NULL AUTO_INCREMENT, "






+
"dataField
VARCHAR(64),
PRIMARY
KEY
(priKey))");









// 获取自增一字段值




rs = stmt.executeQuery("SELECT priKey, dataField "






+ "FROM autoIncTutorial");




rs.moveToInsertRow();




rs.updateString("dataField", "AUTO INCREMENT here?");




rs.insertRow();












rs.last();











int autoIncKeyFromRS = rs.getInt("priKey");




rs.close();




rs = null;




System.out.println("Key returned for inserted row: "






+ autoIncKeyFromRS);



} finally {




if (rs != null) {





try {






rs.close();





} catch (SQLException ex) {












}




}




if (stmt != null) {





try {






stmt.close();





} catch (SQLException ex) {

GBase 8a 程序员手册JDBC 篇
南大通用数据技术股份有限公司

- 153 -












}




}



}


} catch (SQLException ex) {



// 处理错误



System.out.println("SQLException: " + ex.getMessage());



System.out.println("SQLState: " + ex.getSQLState());



System.out.println("VendorError: " + ex.getErrorCode());


} finally {



conn.close();


}

}
}

db-link 查询语法约束如下

db-link 表只能出现在顶层查询,或同源dblink 的子查询中。出现在本地表
的子查询中时,必须放在relation 子查询中。

例如:如下语句会报语法错误,因为db-link 出现在本地表的子查询中时,
必须用relation 子查询包围。
select * from t1 where exists (select 1 from t2@gc_link as t2 where t2.id = t1.id);

该语句可以修改为如下形式,以保证符合语法规则:
select * from t1 where exists (select 1 from (select 1 from t2@gc_link) as t2 where t2.id
= t1.id);

同源的db-link 表可以直接JOIN。
dblink 表禁止与local table,
relation subquery,
非同源dblink 表,产生直接JOIN 关系。

例如:t1@gc_link JOIN t2@gc_link 是允许的;但t1@gc_link JOIN t2 是不
允许的,
因为db-link 表禁止与本地表直接JOIN,
可以改写SQL 语句为如
下形式:
… (select * from t1@gc_link) t, t2 …

db-link 表的子查询中,禁止出现本地表,非同源dblink 表。

例如:select * from t1@gc_link where exists (select 1 from t2);是不允许的,
因为db-link 表t1@gc_link 的子查询中出现了本地表t2。可以改写为如下
形式:
select * from (select * from t1@gc_link) t where exists (select 1 from t2);

group by 或order by 中的相关子查询,禁止出现db-link 表。

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-04-10)
南大通用数据技术股份有限公司
604
注意

如果仅仅是简单使用,如insert into local_table select * from 同源dblink
表,则可以忽略本节的约束。当查询存在db-link 表与本地表混用(例
如db-link 表JOIN 本地表),或与非同源db-link 表混用时,则需要
遵守如下语法约束,否则查询会报语法错误;

同源db-link 指db-link 的名字相同,名字不同的db-link 称为非同源
db-link。例如t1@gc_link 和t2@gc_link 被认为是同源db-link 的两个
表。t1@gc_link 和x1@gc_link2,被认为是非同源db-link 表,即使
gc_link 和gc_link2 在创建时,using 的是同一个数据源,由于其db-link
名字不同,仍然认为是非同源的。

功能说明
记录每个分片的数据占用磁盘空间信息。
表结构说明
表5- 255 表结构信息说明:




TABLE_VC
待查询表所属的虚拟集群编码
TABLE_SCHEMA
待查询表所属的数据库名
TABLE_NAME
待查询表的表名
SUFFIX
分片名称
HOST
所在节点IP
TABLE_DATA_SIZE
该分片的纯数据占用的存储空间
TABLE_STORAGE_SIZE
该分片的纯数据和元数据占用的存储空间
DATA_PERCENT
该分片的纯数据在所有分片中的占比

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1484