SQL - 如何在列中找到最高数字?

时间:2009-10-10 05:14:43

标签: sql mysql sql-server

假设我在Customers表中有以下数据:(仅此而已)

ID   FirstName   LastName
-------------------------------
20   John        Mackenzie
21   Ted         Green
22   Marcy       Nate

什么类型的SELECT语句可以在ID列中得到数字22?

我需要做这样的事情来生成一个唯一的ID。当然我可以通过自动增量让系统执行此操作,但是我如何获得自动生成的ID?

我想到了“从客户中选择ID”并计算返回的行,但这看起来非常无效,在这种情况下,它会错误地返回“3”,但我需要一个23的唯一ID。

16 个答案:

答案 0 :(得分:100)

你可以做到

SELECT MAX(ID) FROM Customers;

答案 1 :(得分:16)

如果您刚刚将一条记录插入到Customers表中,并且您需要最近填充的ID字段的值,则可以使用SCOPE_IDENTITY函数。这仅在INSERT发生在与SCOPE_IDENTITY调用相同的范围内时才有用。

INSERT INTO Customers(ID, FirstName, LastName)
Values
(23, 'Bob', 'Smith')

SET @mostRecentId = SCOPE_IDENTITY()

这可能对你有用,也可能没用,但这是一个很好的技巧。它也适用于自动生成的列。

答案 2 :(得分:10)

SELECT * FROM Customers ORDER BY ID DESC LIMIT 1

然后获取ID。

答案 3 :(得分:8)

select max(id) from customers

答案 4 :(得分:8)

要随时获取,您可以SELECT MAX(Id) FROM Customers

在您添加的过程中,您也可以使用SCOPE_IDENTITY - 来获取该程序最后添加的ID。
这样更安全,因为它可以保证您获得Id - 以防其他人同时被添加到数据库中。

答案 5 :(得分:7)

如果您正在谈论MS SQL,这是最有效的方法。这将根据标识的任何列从表中检索当前标识种子。

select IDENT_CURRENT('TableName') as LastIdentity

使用MAX(id)更通用,但是例如我有一个包含4亿行的表,需要2分钟才能获得MAX(id)IDENT_CURRENT几乎是瞬间......

答案 6 :(得分:6)

select max(id) from Customers 

答案 7 :(得分:4)

如果您使用的是AUTOINCREMENT,请使用:

SELECT LAST\_INSERT\_ID();

假设您正在使用Mysql: http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

Postgres通过currval(sequence_name)函数处理此问题。

请注意,除非您锁定表格,否则使用MAX(ID)是不安全的,因为在您调用MAX(ID)之前可能(在简化的情况下)有另一个插入,并且您丢失了第一个插入。上面的函数是基于会话的,因此如果插入另一个会话,您仍然会获得您插入的ID。

答案 8 :(得分:2)

如果您没有使用自动递增字段,则可以使用以下内容获得类似的结果:

insert into Customers (ID, FirstName, LastName)
    select max(ID)+1, 'Barack', 'Obama' from Customers;

这将确保在您提取最大ID和插入新记录之间插入表格时,不会出现竞争条件。

这是使用标准的SQL,毫无疑问,使用特定的DBMS可以更好地实现它,但它们不一定是可移植的(我们在商店中非常重视)。

答案 9 :(得分:2)

您也可以使用关系代数。有点冗长的过程,但这里只是了解MAX()的工作原理:

E:=π ID (Table_Name)
E1:=π ID (σ ID> = ID'((ρ ID' E)⋈E)) - π ID (σ ID< ID'((ρ ID' E)⋈E))

你的回答: Table_Name⋈E1

基本上你所做的是减去有序关系(a,b)的集合,其中a < b来自A,其中a,b∈A。

对于关系代数符号,请参阅: Relational algebra From Wikipedia

答案 10 :(得分:1)

以下是我制作下一个 ID 的方法:

INSERT INTO table_name (
            ID,
            FIRSTNAME,
            SURNAME) 
            VALUES ((( 
                    SELECT COALESCE(MAX(B.ID)+1,1) AS NEXTID 
                        FROM table_name B
                        )), John2, Smith2);

这样您就可以确保即使表 ID 为 NULL,它仍然可以正常工作。

答案 11 :(得分:0)

取决于您正在使用的SQL实现。例如,MySQL和SQLite都有获取最后一个插入ID的方法。事实上,如果你正在使用PHP,那么甚至还有一个非常好的功能就是mysql_insert_id()。

您可能应该使用此MySQL功能而不是查看所有行以获取最大的插入ID。如果你的桌子变大,那可能会变得非常低效。

答案 12 :(得分:0)

如果您只想选择id,请使用select max(id) from customer

如果要选择整行,请使用如下查询:

select c1.*
from customer c1, (select max(id) as max_id from customer )c2 
where c1.id=c2.max_id

c2是包含max id的新临时表的别名。然后将其交叉产品与客户表一起使用以获取整行。

在这里,我们在from子句中编写查询,这通常非常有用。

答案 13 :(得分:-1)

select * from tablename order by ID DESC

将为您提供ID为22的行

答案 14 :(得分:-1)

在PHP中:

$sql = mysql_query("select id from customers order by id desc");
$rs = mysql_fetch_array($sql);
if ( !$rs ) { $newid = 1; } else { $newid = $rs[newid]+1; }

因此$newid = 23,如果列id中的最后一条记录是22。

答案 15 :(得分:-1)

要查找下一个(仍未使用的)自动增量,我已经使用了几年了。

public function getNewAI($table)
    {
        $newAI = false;

        $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        if(mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        $sql = "SHOW TABLE STATUS LIKE '".$table."'";

        $result = $mysqli->query($sql);

        if($result) {
            $row = $result->fetch_assoc();

            $newAI = $row['Auto_increment'];
        }
        $mysqli->close();

        return $newAI;
    }