首页 / MYSQL / MySQL获取其他表的主键
MySQL获取其他表的主键
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL获取其他表的主键,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5572字,纯文字阅读大概需要8分钟。
内容图文
优点:早期较为通用的做法
缺点:需要操作ResultSet的游标,代码冗长。
2. 通过JDBC3.0提供的getGeneratedKeys()方式
[java] view plaincopy- Statement stmt = null;
- ResultSet rs = null;
- try {
- stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
- java.sql.ResultSet.CONCUR_UPDATABLE);
- // ...
- // 省略若干行(如上例般创建demo表)
- // ...
- stmt.executeUpdate(
- "INSERT INTO autoIncTutorial (dataField) "
- + "values (‘Can I Get the Auto Increment Field?‘)",
- Statement.RETURN_GENERATED_KEYS); // 向驱动指明需要自动获取generatedKeys!
- int autoIncKeyFromApi = -1;
- rs = stmt.getGeneratedKeys(); // 获取自增主键!
- if (rs.next()) {
- autoIncKeyFromApi = rs.getInt(1);
- } else {
- // throw an exception from here
- }
- rs.close();
- rs = null;
- System.out.println("Key returned from getGeneratedKeys():"
- + autoIncKeyFromApi);
- } finally { ... }
优点: 1. 操作方便,代码简洁 2. jdbc3.0的标准 3. 效率高,因为没有额外访问数据库
这里补充下, a.在jdbc3.0之前,每个jdbc driver的实现都有自己获取自增主键的接口。在mysql jdbc2.0的driver org.gjt.mm.mysql 中,getGeneratedKeys()函数就实现在 org.gjt.mm.mysql.jdbc2.Staement.getGeneratedKeys()中。这样直接引用的话,移植性会有很大影响。 JDBC3.0通过标准的getGeneratedKeys很好的弥补了这点。 b.关于getGeneratedKeys(),官网还有更详细解释:OracleJdbcGuide
3. 通过SQL select LAST_INSERT_ID()
[java] view plaincopy- Statement stmt = null;
- ResultSet rs = null;
- try {
- stmt = conn.createStatement();
- // ...
- // 省略建表
- // ...
- stmt.executeUpdate(
- "INSERT INTO autoIncTutorial (dataField) "
- + "values (‘Can I Get the Auto Increment Field?‘)");
- int autoIncKeyFromFunc = -1;
- rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); // 通过额外查询获取generatedKey
- if (rs.next()) {
- autoIncKeyFromFunc = rs.getInt(1);
- } else {
- // throw an exception from here
- }
- rs.close();
- System.out.println("Key returned from " +
- "‘SELECT LAST_INSERT_ID()‘: " +
- autoIncKeyFromFunc);
- } finally {...}
补充: 1. 这个函数,在mysql5.5手册的定义是:“returns a BIGINT (64-bit) value representing the first automatically generated value successfully inserted for an AUTO_INCREMENT column as a result of the most recently executed INSERT statement.”。文档点此 2. 这个函数,在connection维度上是“线程安全的”。就是说,每个mysql连接会有个独立保存LAST_INSERT_ID()的结果,并且只会被当前连接最近一次insert操作所更新。也就是2个连接同时执行insert语句时候,分别调用的LAST_INSERT_ID()不会相互覆盖。举个栗子:连接A插入表后LAST_INSERT_ID()返回100,连接B插入表后LAST_INSERT_ID()返回101,但是连接A重复执行LAST_INSERT_ID()的时候,始终返回100,而不是101。这个可以通过监控mysql连接数和执行结果来验证,这里不详述实验过程。 3. 在上面那点的基础上,如果在同一个连接的前提下同时执行insert,那可能2次操作的返回值会相互覆盖。因为LAST_INSERT_ID()的隔离程度是连接级别的。这点,getGeneratedKeys()是可以做的更好,因为getGeneratedKeys()是statement级别的。同个connection的多次statement,getGeneratedKeys()是不会被相互覆盖。
4. 通过SQL SELECT @@IDENTITY
这个方式和LAST_INSERT_ID() 效果是一样的。官网文档如此表述:“This variable is a synonym for the last_insert_id variable. It exists for compatibility with other database systems. You can read its value with SELECT @@identity, and set it using SET identity.” 文档点此重要补充: 无论是SELECT LAST_INSERT_ID()还是SELECT @@IDENTITY,对于一条insert语句插入多条记录,永远只会返回第一条插入记录的generatedKey.如: [java] view plaincopy
- INSERT INTO t VALUES
- -> (NULL, ‘Mary‘), (NULL, ‘Jane‘), (NULL, ‘Lisa‘);
LAST_INSERT_ID(), @@IDENTITY都只会返回‘Mary‘所在的那条记录的generatedKey
MySQL获取其他表的主键
标签:
本文系统来源:http://www.cnblogs.com/SunShineSimple/p/5024149.html
内容总结
以上是互联网集市为您收集整理的MySQL获取其他表的主键全部内容,希望文章能够帮你解决MySQL获取其他表的主键所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。