SELECT LAST_INSERT_ID() as id FROM table1
为什么此查询有时会返回除table1之外的另一个表的最后插入ID? 我在Node.js(db-mysql插件)中调用它,我只能进行查询。
答案 0 :(得分:22)
LAST_INSERT_ID()只能告诉您整个数据库连接最近自动生成的ID 的ID ,而不是每个单独的表,这也是查询应该只读{{}的原因。 1}} - 没有指定表格。一旦在该连接上触发另一个INSERT查询,它就会被覆盖。如果您希望在插入某个表时生成ID,那么必须在执行此操作后立即运行SELECT LAST_INSERT_ID()
(或使用一些为您执行此操作的API函数)。
如果您想要当前在任意表中的最新ID,则必须在该表上执行SELECT LAST_INSERT_ID()
,其中SELECT MAX(id)
是您的ID列的名称。但是,这不一定是最近生成的ID,如果该行已被删除,也不一定是从您的连接生成的,以防另一个连接设法在您自己的INSERT和您选择的ID之间执行INSERT。
(对于记录,您的查询实际返回包含该数据库连接上最近生成的ID的N行,其中N是table1中的行数。)
答案 1 :(得分:2)
SELECT id FROM tableName ORDER BY id DESC LIMIT 1
答案 2 :(得分:1)
看看doc(可能为时已晚,仅供参考) https://github.com/felixge/node-mysql/#getting-the-id-of-an-inserted-row
答案 3 :(得分: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;
答案 4 :(得分:0)
试试这个。这是有效的
select (auto_increment-1) as lastId
from information_schema.tables
where table_name = 'tableName'
and table_schema = 'dbName'
答案 5 :(得分:0)
最简单的方法: 从table_name中选择max(id);
答案 6 :(得分:0)
如果我不知道所生成的ID,我只会在MySQL中使用CustomPainter
或在SQLServer中使用class ShapesPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint();
// set the color property of the paint
paint.color = Colors.yellow;
// center of the canvas is (x,y) => (width/2, height/2)
final center = Offset(size.width / 2, size.height / 2);
// draw the circle on centre of canvas having radius 75.0
canvas.drawCircle(center, size.width / 2, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
return true;
}
@override
bool hitTest(Offset position) {
final Offset center = Offset(200, 200);
Path path = Path();
path.addRRect(RRect.fromRectAndRadius(
Rect.fromCenter(center: center, width: 400, height: 400),
Radius.circular(center.dx)));
path.close();
return path.contains(position);
}
}
class ShapesPainter1 extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
final paint = Paint();
// set the color property of the paint
paint.color = Colors.red;
// center of the canvas is (x,y) => (width/2, height/2)
var center = Offset(size.width / 2, size.height / 2);
// draw the circle on centre of canvas having radius 75.0
canvas.drawCircle(center, size.width / 2, paint);
}
@override
bool shouldRepaint(CustomPainter oldDelegate) {
// TODO: implement shouldRepaint
return true;
}
@override
bool hitTest(Offset position) {
final Offset center = Offset(100, 100);
Path path = Path();
path.addRRect(RRect.fromRectAndRadius(
Rect.fromCenter(center: center, width: 200, height: 200),
Radius.circular(center.dx)));
path.close();
return path.contains(position);
}
}
。
auto_increment
是简单的出路,但很危险。
处理相关ID的一种方法是将它们存储在util表中,例如:
identity(1,1)
您还可以创建一个存储过程来生成并返回X表的下一个ID
select last_insert_id()
要使用它
create table correlatives(
last_correlative_used int not null,
table_identifier varchar(5) not null unique
);
这允许您在插入记录之前保留ID。有时,您希望在完成插入之前在表单中显示下一个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 ;
答案 7 :(得分:0)
在我的表中inv_id是自动递增
出于我的目的,这是可行的
select `inv_id` from `tbl_invoice`ORDER BY `inv_id` DESC LIMIT 1;