问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql数据库中怎么获取表的主键

发布网友 发布时间:2022-04-30 19:04

我来回答

2个回答

懂视网 时间:2022-04-30 23:25

  • ResultSet rs = null;  
  • try {  
  •     stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  // 创建Statement  
  •                                 java.sql.ResultSet.CONCUR_UPDATABLE);  
  •     stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial");  
  •     stmt.executeUpdate(                                                // 创建demo表  
  •             "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");                        // 获取刚插入记录的主键preKey  
  •     rs.close();  
  •     rs = null;  
  •     System.out.println("Key returned for inserted row: "  
  •         + autoIncKeyFromRS);  
  • }  finally {  
  •     // rs,stmt的close()清理  
  • }  
  • 优点:早期较为通用的做法

    缺点:需要操作ResultSet的游标,代码冗长。

    2. 通过JDBC3.0提供的getGeneratedKeys()方式

    [java] view plaincopy
    1. Statement stmt = null;  
    2. ResultSet rs = null;  
    3. try {  
    4.     stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,  
    5.                                 java.sql.ResultSet.CONCUR_UPDATABLE);    
    6.     // ...  
    7.     // 省略若干行(如上例般创建demo表)  
    8.     // ...  
    9.     stmt.executeUpdate(  
    10.             "INSERT INTO autoIncTutorial (dataField) "  
    11.             + "values (‘Can I Get the Auto Increment Field?‘)",  
    12.             Statement.RETURN_GENERATED_KEYS);                      // 向驱动指明需要自动获取generatedKeys!  
    13.     int autoIncKeyFromApi = -1;  
    14.     rs = stmt.getGeneratedKeys();                                  // 获取自增主键!  
    15.     if (rs.next()) {  
    16.         autoIncKeyFromApi = rs.getInt(1);  
    17.     }  else {  
    18.         // throw an exception from here  
    19.     }   
    20.     rs.close();  
    21.     rs = null;  
    22.     System.out.println("Key returned from getGeneratedKeys():"  
    23.         + autoIncKeyFromApi);  
    24. }  finally { ... }  
    这种方式只需要2个步骤:1. 在executeUpdate时激活自动获取key; 2.调用Statement的getGeneratedKeys()接口
    优点: 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
    1. Statement stmt = null;  
    2. ResultSet rs = null;  
    3. try {  
    4.     stmt = conn.createStatement();  
    5.     // ...  
    6.     // 省略建表  
    7.     // ...  
    8.     stmt.executeUpdate(  
    9.             "INSERT INTO autoIncTutorial (dataField) "  
    10.             + "values (‘Can I Get the Auto Increment Field?‘)");  
    11.     int autoIncKeyFromFunc = -1;  
    12.     rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");             // 通过额外查询获取generatedKey  
    13.     if (rs.next()) {  
    14.         autoIncKeyFromFunc = rs.getInt(1);  
    15.     }  else {  
    16.         // throw an exception from here  
    17.     }   
    18.     rs.close();  
    19.     System.out.println("Key returned from " +  
    20.                        "‘SELECT LAST_INSERT_ID()‘: " +  
    21.                        autoIncKeyFromFunc);  
    22. }  finally {...}  
    这种方式没什么好说的,就是额外查询一次函数LAST_INSERT_ID(). 优点:简单方便 缺点:相对JDBC3.0的getGeneratedKeys(),需要额外多一次数据库查询。
    补充: 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
    1. INSERT INTO t VALUES  
    2.     -> (NULL, ‘Mary‘), (NULL, ‘Jane‘), (NULL, ‘Lisa‘);  

    LAST_INSERT_ID(), @@IDENTITY都只会返回‘Mary‘所在的那条记录的generatedKey

    MySQL获取其他表的主键

    标签:

    热心网友 时间:2022-04-30 20:33

    在SYBASE的ASE和ASA中,可以使用如下的系统存储过程来获取主键:
    exec
    sp_pkeys
    'table_name';
    sql
    server也是一样的!
    至于mysql,我没这个环境,相信应该有类似的存储过程的!
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 迅游加速其支持warframe 战争框架这款游戏吗 得了糖尿病 还能活多久 糖尿病晚期能活多久? warframe国际服怎么下载 在一些借钱软件实名认证,没借钱,卸载后,会有什么影响 糖尿病能活多久? 路由器上的wps功能安全性怎么样 星际战甲提示部分更新内容无法从我们的服务器下载,用什么加速器(已试用:灵缇 麻雀 uu)? 存在wps office文件安全吗 糖尿病人一般可以活多少岁? 在一些借钱软件实名认证,没借钱上传了身份证正反面还绑定银行卡,卸载后,会有什么影响 存在手机上wps office文档安全吗? 得了糖尿病能活几年?? warframe用什么加速器好? wps文档会不会泄漏 拍拍贷借款实名认证了有什么风险 糖尿病可以活多久? 在很多贷款平台实名认证了还有绑定银行卡了,有没有风险呀,对以后有没有影响呀 最近在许多网贷平台申请过贷款,都注册了,实名制的,也没贷上款,那注册过的信息对自己有什么影响吗 在网贷平台上输入了身份信息银行卡等信息审核还是实名,但自己没贷款,不会有影响吧? 在奶茶店工作难吗,制作奶茶跟步骤? warframe需要验证收不到代码怎么办 《读绘本学英语》BabyBedtime大象妈妈,大象宝宝 丽声英语绘本第7级《我才不要穿》录音和《小狗英雄》录音。谢谢了 你的支付宝收钱码已由圆通速递发出,运单号YT4297211238352,查询运单信息可在? 英语绘本从头到脚读书笔记 关于大象的英语小短文(体形,等等) 火速翻译一篇英文文章——the elephant is the biggest four-legged animals 找人类的好朋友的英语故事 英语介绍大象 用英语描写大象的外形十句以上小学三年级 一个英语故事,讲的是一个老人卖一头耳朵坏了的大象,一个年轻人从来没见过大象,就走过去看… 大象的英文有几种? 托马斯和他的朋友们 查理大象是哪一集 丹东鸭绿江断桥离丹东市内远么? 丹东有哪些好玩的景点 什么是数码照相机? 什么是数码单反相机? 数码相机是谁发明的? 对方不用这个了,我打语音电话能通吗?