17
SELECT LAST_INSERT_ID() as id FROM table1

为什么此查询有时会返回 table1 以外的另一个表的最后插入的 id?我在 Node.js(db-mysql 插件)中调用它,我只能做查询。

4

8 回答 8

35

LAST_INSERT_ID()只能告诉你ID最近ID 为整个数据库连接自动生成的,而不是每个单独的表,这也是为什么查询应该只读取SELECT LAST_INSERT_ID()- 而不指定表的原因。
一旦您INSERT在该连接上启动另一个查询,它就会被覆盖。如果您希望在ID插入某个表时生成,则必须在执行此操作后立即运行SELECT LAST_INSERT_ID()(或使用一些为您执行此操作的 API 函数)。

如果您想要ID任意表中当前的最新数据,则必须SELECT MAX(id)在该表上执行 a,其中列id的名称在哪里ID。但是,这不一定是最近生成ID的,以防该行已被删除,也不一定是从您的连接生成的,以防另一个连接设法INSERT在您自己INSERT和您选择的ID.

(作为记录,您的查询实际上返回 N 行,其中包含该数据库连接上最近生成的 ID,其中 N 是 中的行数table1。)

于 2012-08-25T20:36:38.043 回答
3

SELECT id FROM tableName ORDER BY id DESC LIMIT 1

于 2017-06-18T07:47:36.887 回答
0

我通常选择自动递增的 ID 字段,按字段降序排列并将结果限制为 1。例如,在 wordpress 数据库中,我可以通过执行以下操作获取 wp_options 表的最后一个 ID:

SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 1;

希望有帮助。

编辑- 锁定表以避免更新可能导致返回错误 ID 的表可能是有意义的。

LOCK TABLES wp_options READ;
SELECT option_id FROM wp_options ORDER BY option_id DESC LIMIT 1;
于 2016-07-25T20:51:24.007 回答
0

试试这个。这是有效的

select (auto_increment-1) as lastId
from information_schema.tables
where table_name = 'tableName'
and table_schema = 'dbName'
于 2017-03-14T13:24:27.630 回答
0

如果我知道我永远不会关心生成的 id,我只会auto_increment在 MySQL 或SQL Server 中使用。identity(1,1)

select last_insert_id()是简单的出路,但很危险。

处理相关 id 的一种方法是将它们存储在 util 表中,例如:

create table correlatives(
    last_correlative_used int not null, 
    table_identifier varchar(5) not null unique
);

你也可以创建一个存储过程来生成并返回X表的下一个id

drop procedure if exists next_correlative;
DELIMITER //
create procedure next_correlative(
    in in_table_identifier varchar(5)
)
BEGIN
    declare next_correlative int default 1;

    select last_correlative_used+1 into next_correlative from correlatives where table_identifier = in_table_identifier;

    update correlatives set last_correlative_used = next_correlative where table_identifier = in_table_identifier;

    select next_correlative from dual;
END //
DELIMITER ;

使用它

call next_correlative('SALES');

这允许您在插入记录之前保留 ID。有时您希望在完成插入之前在表单中显示下一个 id,并有助于将其与其他调用隔离开来。

这是一个测试脚本来搞乱:

create database testids;

use testids;

create table correlatives(
    last_correlative_used int not null, 
    table_identifier varchar(5) not null unique
);

insert into correlatives values(1, 'SALES');

drop procedure if exists next_correlative;
DELIMITER //
create procedure next_correlative(
    in in_table_identifier varchar(5)
)
BEGIN
    declare next_correlative int default 1;
    select last_correlative_used+1 into next_correlative  from correlatives where table_identifier = in_table_identifier;
    update correlatives set last_correlative_used = next_correlative where table_identifier = in_table_identifier;
    select next_correlative from dual;
END //
DELIMITER ;

call next_correlative('SALES');
于 2019-06-29T04:20:02.573 回答
0

如果您想使用这些解决方法:

  • SELECT id FROM tableName ORDER BY id DESC LIMIT 1
  • 从表名中选择 MAX(id)

建议在插入行后使用where子句。没有这个,您将遇到不一致的问题

于 2021-12-07T19:01:51.070 回答
-1

最简单的方法:select max(id) from table_name;

于 2018-12-26T21:22:01.063 回答
-1

在我的表中 inv_id 是自动增量

出于我的目的,这是可行的

select `inv_id` from `tbl_invoice`ORDER BY `inv_id` DESC LIMIT 1;
于 2020-06-21T08:54:03.303 回答