假设我在Customers表中有以下数据:(仅此而已)
ID FirstName LastName
-------------------------------
20 John Mackenzie
21 Ted Green
22 Marcy Nate
什么类型的SELECT语句可以在ID列中得到数字22?
我需要做这样的事情来生成一个唯一的ID。当然我可以通过自动增量让系统执行此操作,但是我如何获得自动生成的ID?
我想到了“从客户中选择ID”并计算返回的行,但这看起来非常无效,在这种情况下,它会错误地返回“3”,但我需要一个23的唯一ID。
答案 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;
}