oracle jdbc 获取自动生成的键值,int id primary key auto_increment;

用jdbc getGenerationKey属性
================================

public static void main(String args[]) {
       
        	String sql="insert into cdml_sensky_user(uuid,version) values('123','123456789')";
        	int rows = -1;
            try {
            	Class.forName("oracle.jdbc.driver.OracleDriver");
            	   Connection conn = DriverManager
            	    .getConnection("jdbc:oracle:thin:@ip:1521:dbname","username","pwd");    //连接数据库
            	conn.setAutoCommit(false);       //不自动提交
//            	Connection conn =pool.getConnection();
            	PreparedStatement pstat =conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            	//创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键,适合insert语句

            	//(该语句能自动生成键值)autoGeneratedKeys - 指示是否应该返回自动生成的键的标志

            	//它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一

            	Statement stat = conn.createStatement();

//            	pstat.setInt(1, -1);
//            	pstat.setString(2,title);
//            	pstat.setString(3,content);
            	pstat.executeUpdate();

            	ResultSet rsKey = pstat.getGeneratedKeys();      //ResultSet 指示键值
            	rsKey.next();
            	int key = rsKey.getInt(1);     //得到第一个键值
            	rsKey.close();
            	stat.executeUpdate("update cdml_sensky_user set uuid = " + key + " where id = " + key);

            	conn.commit();
            	conn.setAutoCommit(true);     //设回自动提交
            	pstat.close();
            	conn.close();
                	System.out.println("111");
             



                //System.out.println("num:"+num);
            } catch (Exception e) {
                e.printStackTrace();
            }
            //return rows;

    }

 


http://hi.baidu.com/%BD%D6%D0?%F3%B5%C1/blog/item/0d3bf6fd3e4226fbfc037fda.html
获取自动生成的键值,int id primary key auto_increment;
=======================================================================================
java.sql.SQLException: 不支持的特性
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.dbaccess.DBError.throwUnsupportedFeatureSqlException(DBError.java:690)
at oracle.jdbc.driver.OracleConnection.prepareStatement(OracleConnection.java:3452)
at db.NewDBManager.main(NewDBManager.java:131)
=====================================================================================

据张P说Oracle11g可以支持新特性,现在用的方法是存储过程

create or replace procedure USER_REGIST(p_version in varchar2,p_userid  out number) is 
  /** 
  * java书城用mtk用户表注册 
  */ 
begin 
  p_userid := -1; 
  insert into cdml_sensky_user 
    (id,uuid,VERSION) 
  values 
    (p_userid,p_userid,p_version) 
  returning id into p_userid;   --dbms_output.put_line(p_userid); 
   update cdml_sensky_user set uuid=to_char(p_userid) where id=p_userid; 
  commit; 
exception 
  when others then 
    rollback; 
    p_userid := -1; 
end USER_REGIST; 
17:53 2011-6-24 
declare user_id int; 
begin 

USER_REGIST(123456789,user_id); 
dbms_output.put_line(user_id); 
end; 


 
 
<think>好的,我现在需要帮助用户了解在创建数据库表时ID字段的自动生成机制。首先,我要确认用户的问题是什么。用户可能是在设计数据库表结构时,想知道如何让ID字段自动生成,比如自动递增或使用某种算法生成唯一ID。 根据用户提供的引用内容,引用[2]提到应用层生成ID会增加复杂度,而引用[4]提到了使用SQLAlchemy自动生成数据库表,可能涉及ORM框架的ID处理。引用[1]和[3]可能和数据库表的创建过程相关,但具体到ID生成,可能需要更多的数据库相关知识。 接下来,我需要整理常见的数据库自动生成ID的方法。首先想到的是自增主键,这在MySQL中是AUTO_INCREMENT,在PostgreSQL中是SERIAL或IDENTITY,Oracle则使用SEQUENCE。这些是数据库内置的功能,不需要应用层干预,属于用户提到的自动生成机制。 然后是UUID,虽然它生成长字符串,但能保证全局唯一,适用于分布式系统。不过存储空间较大,索引效率可能不如自增ID。 还有复合主键,可能由多个字段组合而成,但这种情况自动生成的情况较少,更多是手动指定。 另外,ORM框架如Hibernate或SQLAlchemy可能在应用层生成ID,例如使用UUID或雪花算法。引用[4]中的SQLAlchemy示例可能展示了如何通过类定义自动生成表结构,其中ID字段可能配置了自动生成策略。 用户提到的引用[2]指出应用层生成ID会增加复杂度,所以可能需要权衡是否使用数据库内置的自增还是应用层生成的UUID等。 此外,需要考虑不同数据库的语法差异,比如MySQL和PostgreSQL在自增实现上的不同,以及如何在不同ORM框架中配置这些选项。 最后,用户可能想知道在实际开发中如何选择这些方法,各自的优缺点是什么。需要结合场景,比如单机还是分布式,是否需要全局唯一,性能要求等。 现在需要将这些信息组织成结构清晰的回答,分点说明,并引用提供的参考文献。同时生成相关问题,帮助用户进一步了解。</think>在数据库设计中,ID字段的自动生成机制是实现数据唯一性和管理效率的关键。以下是常见实现方式及原理: ### 一、自动生成ID的常见机制 1. **数据库内置自增主键** - **MySQL**: 使用`AUTO_INCREMENT`属性,ID按固定步长递增 ```sql CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)); ``` - **PostgreSQL**: 通过`SERIAL`类型或`GENERATED AS IDENTITY`语法实现 ```sql CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(50)); ``` - **Oracle**: 依赖序列(SEQUENCE)和触发器实现自增[^2] 2. **UUID全局唯一标识符** 生成128位的唯一字符串,如`550e8400-e29b-41d4-a716-446655440000`,适用于分布式系统 ```sql CREATE TABLE orders (id UUID PRIMARY KEY DEFAULT gen_random_uuid()); ``` 3. **ORM框架生成策略** 如SQLAlchemy中通过`autoincrement=True`配置自动生成[^4] ```python class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String) ``` ### 二、实现方式对比 | 方法 | 优点 | 缺点 | |---------------|-------------------------|------------------------------| | 自增主键 | 查询效率高,存储空间小 | 分布式环境下可能产生ID冲突 | | UUID | 全局唯一,无需协调 | 存储空间大,索引效率较低 | | ORM框架生成 | 跨数据库兼容性好 | 依赖应用层逻辑 | ### 三、设计建议 1. 单机系统优先选择数据库自增主键 2. 分布式系统建议采用雪花算法或UUID 3. 使用ORM工具时,需明确指定主键生成策略 4. 需要获取生成的主键时,可通过JDBC`getGeneratedKeys()`或ORM接口实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值