Mysql查询表中最小可用id值的方法

今天在看实验室的项目时,碰到了一个让我“棘手”的问题,其实也是自己太笨了。先把 sql 语句扔出来

// 这条语句在id没有1时,不能得到正确的查询结果。
select min(id+1) from oslist c where not exists (select id from oslist where id = c.id+1);

刚开始看到这条查询语句,完全是一脸懵X的状态,可能也是好久没碰 sql 了。

1 exists语法

sql 语法中, exists 用来筛选结果。实际执行过程中, exists 语句是对外表作loop循环,每次loop循环再对内表进行查询操作。把外表的记录逐条代入到子查询,如果子查询结果集为空,说明不存在,反之,则存在。

此处要注意的是,这里把外表的记录代入到子查询中,只是看得到的查询结果是否为 空 ,而不是做实质性的值比较。

举个例子吧:

如果表oslist中的id为1,2,3,4,5,6,7,8,9,10,11,14,15。此处采用文章最开始的sql语句,使用自连接。

那么在查询过程如下:

取id为1,看oslist中存在id = 2的否?,存在,则不纳入结果集;
 取id为2,看oslist中存在id = 3的否?,存在,则不纳入结果集;
 取id为3,看oslist中存在id = 4的否?,存在,则不纳入结果集;
 取id为4,看oslist中存在id = 5的否?,存在,则不纳入结果集;
 取id为5,看oslist中存在id = 6的否?,存在,则不纳入结果集;
 取id为6,看oslist中存在id = 7的否?,存在,则不纳入结果集;
 取id为7,看oslist中存在id = 8的否?,存在,则不纳入结果集;
 取id为8,看oslist中存在id = 9的否?,存在,则不纳入结果集;
 取id为9,看oslist中存在id = 10的否?,存在,则不纳入结果集;
 取id为10,看oslist中存在id = 11的否?,存在,则不纳入结果集;
 取id为11,看oslist中存在id = 12的否?,不存在,则纳入结果集;
 取id为14,看oslist中存在id = 15的否?,存在,则不纳入结果集;
 取id为15,看oslist中存在id = 16的否?,不存在,则纳入结果集;
 取(11+1)与(15+1)中值最小的那个,然后返回结果。

结束查询。

ps:MySQL中删除id为最小的数据

//方法1
 delete from 表名 where id in (select id from (select min(id) id from 表名 c1) t1);
//方法2
delete from 表名 order by id asc limit 1;

总结

以上所述是小编给大家介绍的Mysql查询表中最小可用id值的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • mysql自增ID起始值修改方法

    在mysql中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍mysql自增ID的起始值修改与设置方法.通常的设置自增字段的方法:创建表格时添加: 复制代码 代码如下: create table table1(id int auto_increment primary key,...) 创建表格后添加: 复制代码 代码如下: alter table table1 add id int auto_increment primary key 自

  • PHP获取MySql新增记录ID值的3种方法

    一.使用语句: 复制代码 代码如下: mysql_query("select max(id) from t1",$link); 使用此方法得到的是 id最大的值,确为最后一个值,但当多链接线程时,这个最大的id并不一定是我们插入数据的自增id值,因此不适用于多线程. 二,使用函数:msyql_insert_id(); 在PHP中,经常需要把插入数据库中的id值取出来,而正好有这么一个函数: 复制代码 代码如下: <?php //执行插入数据库的语句 //-- $getID=mys

  • Mysql获取id最大值、表的记录总数等相关问题的方法汇总

    一.mysql 获取当前字段最大id SQL语句: select max(id) from yourtable; 二.获取mysql表自增(Auto_increment)值 Auto_increment是表中的一个属性,只要把表的状态获取到,也就可以获取到那个自增值 SQL语句: show table status like "表名"; php代码实现 $get_table_status_sql = "SHOW TABLE STATUS LIKE '表名'"; $r

  • 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

    分表除了表名的索引不同之外,表结构都是一样的,如果各表的'ID'字段仍采用'AUTO_INCREMENT'的方式的话,ID就不能唯确定一条记录了. 这时就需要一种处于各个分表之外的机制来生成ID,我们一般采用一张单独的数据表(不妨假设表名为'ticket_mutex')来保存这个ID,无论哪个分表有数据增加时,都是先到ticket_mutex表把ID值加1,然后取得ID值. 这个取ID的操作看似很复杂,所幸的是,MySQL提供了LAST_INSERT_ID机制,让我们能一步完成. 1.新建数据表

  • Java获取最后插入MySQL记录的自增ID值的3种方法

    方法一: 复制代码 代码如下: String sql = "INSERT INTO users (username,password,email) VALUES (?,?,?);";PreparedStatement pstmt = (PreparedStatement) conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//传入参数:Statement.RETURN_GENERATED_KEYSpstmt.setSt

  • Mysql查询表中最小可用id值的方法

    今天在看实验室的项目时,碰到了一个让我"棘手"的问题,其实也是自己太笨了.先把 sql 语句扔出来 // 这条语句在id没有1时,不能得到正确的查询结果. select min(id+1) from oslist c where not exists (select id from oslist where id = c.id+1); 刚开始看到这条查询语句,完全是一脸懵X的状态,可能也是好久没碰 sql 了. 1 exists语法 sql 语法中, exists 用来筛选结果.实际执

  • Django ORM 查询表中某列字段值的方法

    1.什么是ORM ORM 全拼Object-Relation Mapping. 中文意为 对象-关系映射. 在MVC/MVT设计模式中的Model模块中都包括ORM 2.ORM优势 (1)只需要面向对象编程, 不需要面向数据库编写代码. 对数据库的操作都转化成对类属性和方法的操作. 不用编写各种数据库的sql语句. (2)实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异. 不在关注用的是mysql.oracle...等. 通过简单的配置就可以轻松更换数据库, 而不需要修改代码. 3.

  • PHP在弹框中获取foreach中遍历的id值并传递给地址栏

    1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢. 2. 点击取现按钮,如果没有设置密码->弹框 3. 点击去设置,把用户名通过地址栏传递给别的页面. 4.使用onclick事件,把参数charge传递给function函数.function为弹窗函数. 5. 把username值传递过来.并给"去设置"赋值herf属性. 6. <div class="mask" >&

  • Mysql删除重复数据保留最小的id 的解决方法

    在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GROUP BY peopleName HAVING count(peopleName) > 1 ) AND peopleId NOT IN ( SELECT min(peopleId) FROM people GROUP BY peopleName HAVING count(peopleName) >

  • ASP.NET中访问DataGrid中所有控件值的方法

    本文实例讲述了ASP.NET中访问DataGrid中所有控件值的方法.分享给大家供大家参考,具体如下: <%@ Page Language="C#" %> <%@ import Namespace="System.Collections" %> <script runat="server"> void Page_Load(Object sender, EventArgs e) { if(!Page.IsPost

  • 一览画面点击复选框后获取多个id值的方法

    在web开发中经常会遇到一览画面中每一条记录前都带一个复选框,点击后选中该条记录进行删除.修改.查看等操作. 修改和查看都是获取一条记录的id值后传递到后台进行查询获取该记录对象的各种属性值,再显示到画面上. 我说的重点是选中多条记录后进行批量删除,如何获取多条记录的id值是问题的关键.首先是在jsp页面中全选中复选框的方法. 代码如下: function checkEvent(name, allCheckId) { var allCk = document.getElementById(all

  • 解析MySQL设置当前时间为默认值的方法

    MySQL设置当前时间为默认值的问题我们经常会遇到,下面就为您介绍MySQL设置当前时间为默认值的实现全步骤,希望对您能有所启迪.数据库:test_db1创建表:test_ta1两个字段:id              (自增 且为主键),createtime 创建日期(默认值为当前时间) 方法一.是用alert table语句: 复制代码 代码如下: use test_db1; create table test_ta1( id mediumint(8) unsigned not nulll 

  • mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法.分享给大家供大家参考,具体如下: mysql存储函数只返回一个值.要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程.咱们先来看一个orders表它的结构: mysql> desc orders; +----------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-

  • JS获取多维数组中相同键的值实现方法示例

    本文实例讲述了JS获取多维数组中相同键的值实现方法.分享给大家供大家参考,具体如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> Demo </TITLE> <META NAME="Keywords" CONTENT=""> <META NAME

  • MySQL存储过程中使用WHILE循环语句的方法

    本文实例讲述了MySQL存储过程中使用WHILE循环语句的方法.分享给大家供大家参考.具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc() -> BEGIN -> -> DECLARE i int; -> SET i=1; -> loop1: WHILE i<=10 DO -> IF MOD(i,2)<>0 THEN /*Even num

随机推荐