数据库开发中,如果有主表T1,子表T2的情况下,假设T1中的主键是自动增长的,有很多时候需要在同一个事务中对T1进行插入操作的同时,对T2进行插入操作,这是需要T1的自动增长列,美美遇到此时都感觉非常麻烦。比如MySQL中有表:
CREATE
TABLE `test` (
`tid`
int(4) NOT NULL auto_increment,
`tnamve`
varchar(20) default NULL,
PRIMARY
KEY (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如何在插入的同时获取到自动增长列的值呢?
在JDBC的3.0中有相关的实现。
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
Connection
conn=DriverManager.getConnection(url,"root","root");
Statement stmt=conn.createStatement();
String sql="insert into test values
(default,'testidentity')";
int rows=stmt.executeUpdate(sql);
ResultSet rs=stmt.getGeneratedKeys();
rs.next();
int result=rs.getInt(1);
System.out.println(obj);
结果就是自动增长列的值,JDBC3.0中提供的getGeneratedKeys()方法就是解决这样问题的,上面的JDBC代码在mysql5中测试通过。但是在sqlSQLserver2000中的驱动没有这样的支持,据说在sqlSQLserver2005中有这样的支持。在SqlServer2000该如何处理呢?只能借助于函数SCOPE_IDENTITY、IDENT_CURRENT 或者全局变量 @@IDENTITY了。下面看看他们的用法
在SQLServer中
SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 在功能上相似,它们都返回插入到
IDENTITY 列中的值。
IDENT_CURRENT
不受作用域和会话的限制,而受限于指定的表。
语法: IDENT_CURRENT(‘表名’)
使用IDENT_CURRENT将返回特定表中的最后IDENTITY的值,该值也许是别的事务插入的,也就是说:不受作用域和会话的限制,仅仅受限于指定的表。
SCOPE_IDENTITY 和
@@IDENTITY
返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY
只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
例如,有两个表 T1 和
T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在
T2
中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在
T2 上的插入。
假设 T1 和
T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
@@IDENTITY
返回插入到当前会话中任何作用域内的最后一个IDENTITY 列值,该值是插入 T2 中的值。
SCOPE_IDENTITY()
返回插入 T1 中的
IDENTITY
值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用
SCOPE_IDENTITY()
函数,则该函数将返回 NULL 值。
在应用软件开发中,如果在同一个事务中需要自动增长列,那么SCOPE_IDENTITY()是最好的选择,具体用法如下:
String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";
String url="jdbc:microsoft:sqlserver://localhost:1433;databaseName=pubs";
Class.forName(driver);
Connection
conn=DriverManager.getConnection(url,"sa","");
Statement stmt=conn.createStatement();
String sql="insert into test values
('testidentity') select
scope_identity()";
ResultSet rs=stmt.executeQuery(sql);
rs.next();
int result=rs.getInt(1);
System.out.println(result);
分享到:
相关推荐
在数据库应用开发中,自动增长列的编号生成是一项非常实用的技术。它能够有效地减少应用程序与数据库之间的交互次数,从而提高系统的整体性能。本文将详细探讨一种实现自动增长列编号的方法,并通过一个具体的示例...
这种类型的列在每次插入新行时会自动递增其值,无需手动设置。在本例中,我们关注的是如何在SQL中获取刚插入记录的自动增长列(通常是主键)的值。我们将探讨SQL Server 2000和SQL Server 2005及以上版本的不同处理...
在实际应用中,针对不同参数的钢卷,系统需要有相应的适应性。设备布局方面,文章提出了利用ABB六轴工业机器人IRB6700-150-3.2型号,具有较大的工作半径,能够覆盖钢卷捆带的拆捆位置,并通过具体布局保证系统的稳定...
首先,计算机应用软件自动化开发技术指的是在软件开发全过程中,利用自动化工具和技术来完成业务组件的生成、开发与组装。这项技术的目标是减少人工操作,降低出错率,缩短软件开发周期,并提高软件的质量和后期的可...
在电气自动化技术的应用中,必须注意的关键点包括: - 设备的选择:选择适应性强、技术成熟且维护成本较低的自动化设备; - 系统集成:将电气自动化设备与现有系统和流程有效集成,保证系统的整体高效运行; - 技术...
在“计算机应用软件自动化开发技术”这一主题中,我们可以探讨以下几个关键知识点: 1. **代码生成与重构**:自动化代码生成技术可以根据设计模型自动生成代码,减少了手动编写代码的时间。同时,自动化重构工具...
本文将详细介绍如何使用C语言开发物联网应用,包括物联网的基本概念、C语言在物联网中的应用、开发工具和环境、以及实际的编程示例。 使用C语言开发物联网应用可以充分发挥其性能优势和硬件控制能力。通过选择合适的...
医院OA办公自动化系统的开发应用研究,从内容上来看,主要围绕医院信息化进程中办公自动化系统的构建与应用展开深入探讨。随着信息技术的飞速发展,医院管理对于自动化办公的需求日益增长,OA系统的应用可以有效地...
《华为HMS生态与应用开发实战》是...总的来说,这本书是华为HMS开发者的一本重要参考资料,它不仅提供了理论背景,还包含了丰富的实践案例,帮助开发者理解和掌握HMS生态中的各项服务,从而高效地开发和优化应用程序。
总的来说,CAD二次开发在水利水电工程制图中的应用,可以实现以下功能: - 开发水工专用线型和填充,以符合工程制图的行业标准。 - 利用VisualLisp等编程语言进行复杂功能的实现,比如自动化计算。 - 设计对话框...
该系统在企业实际应用中表现良好,有效缩短了胎具的设计周期,并且提高了设计效率。该系统在功能上实现了对传统手工设计的自动化替代,这对于那些采用部分机械化生产的弯管类零件的企业来说,具有重要的意义。 系统...
在分析PLC(可编程逻辑控制器)在天然气自动化管道运输中的应用时,我们首先需要了解PLC技术的基本优点。PLC技术以其强大的功能和稳定性在工业控制领域中占据重要地位,尤其在能源行业的自动化控制领域应用广泛。...
对于使用LINQ(Language Integrated Query)进行数据库操作的情况,当创建模型类时,可以在属性上标记`[DatabaseGenerated(DatabaseGeneratedOption.Identity)]`,表示该属性对应的数据库列是自动增长的: ...
电气工程及其自动化技术在农村配电网中的应用是现代电力系统发展的重要方向,旨在提升供电效率、保障供电质量和安全。随着科技的进步,自动化技术在农村电网中的应用已经成为改善农村电力供应的关键手段。 首先,...
EJB,在企业应用中承担着数据访问层(Entity Beans)和核心业务层(Session Beans)的角色,其接口设计和性能表现直接影响整个应用的成功与否。因此,从开发早期就开始实施EJB的性能测试,对于保证应用的稳定性和...
### 自动化测试在测试内存泄露中的应用 #### 一、引言 在网络管理系统(网管)软件开发中,软件运行的稳定性被视为衡量软件质量的关键指标之一。影响软件稳定性的因素众多,其中内存泄露问题尤为突出。内存泄露的...
在电气工程及其自动化技术发展的过程中,技术研发人员在不断地对技术进行深化研究和开发,以解决实际应用中遇到的问题,并通过技术进步和突破来提升自动化技术的整体水平。掌握电气工程自动化技术的关键和难点,有助...
3. 分散测控系统中的应用:在分散测控系统中,电力部门积极开发自动化技术,并利用先进技术手段进行全面监控,甄别系统中的风险隐患,并进行风险预防和故障规避。 4. 电网中的应用:随着电网规模的扩大,电网内部...