在MySQL中,应用auto_increment种类的id字段名做为表的主键,并且用它做为别的表的外键约束,产生“主从关系表构造”,它是数据信息库设计方案中常会见的使用方法。可是在实际转化成id的情况下,大家的实际操作次序通常为:先在主表格中插进纪录,随后得到全自动转化成的id,以它为基本插进从表的纪录。 这儿布有个艰难,便是插进主表纪录后,怎样得到它相匹配的id。一般的作法,是根据“select max(id) from tablename”的作法,可是显而易见这类作法必须考虑到高并发的状况,必须在事务管理中对主表多方面“X锁“,待得到max(id)的值之后,再开启。这类作法必须的流程较为多,一些不便,并且高并发性都不好。有木有更简易的作法呢? 回答之一是根据select LAST_INSERT_ID()这一实际操作。乍一看,它和select max(id)很象,但具体上它是进程安全性的。换句话说它是实际于数据信息库联接的。下边根据试验表明: 1、在联接1中向A表插进一条纪录,A表包括一个auto_increment种类的字段名。 2、在联接2中向A表再插进一条纪录。 3、結果:在联接1中实行select LAST_INSERT_ID()获得的結果和联接2中实行select LAST_INSERT_ID()的結果不是同的;而在2个联接中实行select max(id)的結果是同样的。 实际上在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的差别和这儿是相近的。应用SCOPE_IDENTITY()能够得到插进某一IDENTITY字段名确当前对话的值,而应用IDENT_CURRENT()会得到在某一IDENTITY字段名上插进的较大值,而不区别不一样的对话。 注:应用select last_insert_id()时要留意,当一次插进好几条纪录时,仅仅得到第一次插进的id值,尽量留意! 自然,大家还能够应用另外一种更为方便快捷的方式:在JDBC追加纪录后,应用API得到新追加纪录的主键值。 这一完成应用了Statement的getGeneratedKeys方式, 检测程序以下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class GetGenerateKey { public static void main(String[] args) throws Exception { create(); public static void create()throws Exception { System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", ""); Statement st = conn.createStatement(); String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)"; st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); ResultSet rs = st.getGeneratedKeys(); if (rs.next()) { int id = rs.getInt(1); System.out.println ("转化成纪录的key为 :" + id); st.close(); conn.close(); } 程序执行結果: 转化成纪录的key为 :9 数据信息库的纪录为: +----+----------+------------+-------+ | id | name | birthday | money | +----+----------+------------+-------+ | 9 | beck | 1949-10-01 | 60 | +----+----------+------------+-------+ 小结:这一API方式出示的益处便是无需再次再实行一次查寻得到新纪录的key值。降低了工作中量和网络服务器的压力。 留意点,在实行executeUpdate方式的情况下,要特定回到转化成key的选择项。 =========================================================== 2种方式的java 编码 Java编码1 // 用这类方式能获得插进自增的id 非常好用 PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS); for (int i = 0; i pars.length; i++) { pstmt.setObject(i+1, pars[i]); pstmt.executeUpdate(); long autoIncKeyFromApi = -1; ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); return autoIncKeyFromApi; Java编码2 qRunner.update(conn,sql.toString(),pars); Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1)); 之上便是文中的所有內容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多的适用诺心互联网。 (责任编辑:admin) |