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

MYSQL查询表的主键

发布网友 发布时间:2022-04-08 18:06

我来回答

3个回答

懂视网 时间:2022-04-08 22:28

  • 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-08 19:36

    SELECT
    t.TABLE_NAME,
    t.CONSTRAINT_TYPE,
    c.COLUMN_NAME,
    c.ORDINAL_POSITION
    FROM
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t,
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS c
    WHERE
    t.TABLE_NAME = c.TABLE_NAME
    AND t.TABLE_SCHEMA = 'test'
    AND t.CONSTRAINT_TYPE = 'PRIMARY KEY';

    测试执行结果如下:

    mysql> SELECT
    -> t.TABLE_NAME,
    -> t.CONSTRAINT_TYPE,
    -> c.COLUMN_NAME,
    -> c.ORDINAL_POSITION
    -> FROM
    -> INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t,
    -> INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS c
    -> WHERE
    -> t.TABLE_NAME = c.TABLE_NAME
    -> AND t.TABLE_SCHEMA = 'test'
    -> AND t.CONSTRAINT_TYPE = 'PRIMARY KEY'
    -> LIMIT 3;
    +------------+-----------------+-------------+------------------+
    | TABLE_NAME | CONSTRAINT_TYPE | COLUMN_NAME | ORDINAL_POSITION |
    +------------+-----------------+-------------+------------------+
    | mr_dept | PRIMARY KEY | dept_id | 1 |
    | order | PRIMARY KEY | id | 1 |
    | tab | PRIMARY KEY | id | 1 |
    +------------+-----------------+-------------+------------------+
    3 rows in set (0.06 sec)

    热心网友 时间:2022-04-08 20:54

    select*from表名
    然后自己看哪一个是主键
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 对方不用这个了,我打语音电话能通吗? 数码相机是谁发明的? 什么是数码单反相机? 什么是数码照相机? 丹东有哪些好玩的景点 丹东鸭绿江断桥离丹东市内远么? 托马斯和他的朋友们 查理大象是哪一集 大象的英文有几种? 一个英语故事,讲的是一个老人卖一头耳朵坏了的大象,一个年轻人从来没见过大象,就走过去看… 用英语描写大象的外形十句以上小学三年级 英语介绍大象 找人类的好朋友的英语故事 火速翻译一篇英文文章——the elephant is the biggest four-legged animals 关于大象的英语小短文(体形,等等) 英语绘本从头到脚读书笔记 你的支付宝收钱码已由圆通速递发出,运单号YT4297211238352,查询运单信息可在? 丽声英语绘本第7级《我才不要穿》录音和《小狗英雄》录音。谢谢了 《读绘本学英语》BabyBedtime大象妈妈,大象宝宝 warframe需要验证收不到代码怎么办 在奶茶店工作难吗,制作奶茶跟步骤? 东坡肉是哪里的名菜? 东坡肉是中国哪些地方的名菜? 东坡肉是哪里的菜? 东坡焖肉最早发源于哪里啊? 东坡肉是哪里的菜呀? xbox one 除了玩游戏的功能,还有什么功能,求xbox one 的拥有者分享 Xbox除了用来玩游戏,还能用来做什么? 手机换了sim卡怎么换 xbox one 有什么用? KKK是什么 谁能给我(麦克学摇滚,和奥斯卡金曲)的下载包?谢谢啦~~ 哈密住房公积金卡个人办理手续 古人为什么说“万恶淫为首”? 为什么说“万恶淫为首!”? 万恶婬为首是什么意思? 为什么说万恶淫为首!? 人们常说“”万恶淫为首”,这究竟有什么深意呢? 古人所说的“万恶淫为首”是什么意思?为何“淫”是万恶之首呢? 为什么古话说万恶淫为首,百善孝为先? 为什么说“万恶淫为首”?