如何在mysql中获取下一个自动增量id

far*_*oft 102 mysql sql

如何获取mysql中的下一个id以将其插入表中

INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Run Code Online (Sandbox Code Playgroud)

rav*_*404 241

您可以使用

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
Run Code Online (Sandbox Code Playgroud)

或者如果您不想使用information_schema,您可以使用它

SHOW TABLE STATUS LIKE 'table_name'
Run Code Online (Sandbox Code Playgroud)

  • 第二个查询确实返回下一个自动增量值,但它被缓存(默认缓存持续时间为 24 小时)。要获取最新的自动增量值,只需在查询之前运行“SET information_schema_stats_expiry = 0;”。 (3认同)
  • 由于使用缓存来从information_schema.tables中检索数据,因此该解决方案不再对mysql 8起作用。 (2认同)
  • 该官方文档声明“TABLES.AUTO_INCRMENT”已缓存 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_information_schema_stats_expiry 。Mysql博客也有几篇关于它的文章,但他们提到的系统变量似乎已经过时:https://mysqlserverteam.com/mysql-8-0-scaling-and-performance-of-information_schema/ https://mysqlserverteam.com/ mysql-8-0-information_schema 的改进/ (2认同)

Joh*_*ica 48

您可以通过执行以下操作获得下一个自动增量值:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'
Run Code Online (Sandbox Code Playgroud)

请注意,您应使用此修改表,使用AUTO_INCREMENT列要做到这一点,而不是自动.
问题是last_insert_id()回顾性的,因此可以在当前连接中得到保证.
这个婴儿是有前途的,因此并非每个连接都是唯一的,不能依赖.
只有在一个连接数据库中它才能工作,但是今天的单一连接数据库有一个明天就会成为多个连接数据库的习惯.

看到: SHOW TABLE STATUS

  • 我没有对它进行投票,但尝试使用最后一个自动递增值的问题是,当你使用它时它可能不是最后一个 - 无论SELECT和后续INSERT的执行速度有多快. (5认同)
  • `SHOW TABLE STATUS`希望在'LIKE'之后看`FROM`和''table name pattern'之后``database name`. (3认同)
  • 由于使用缓存来从information_schema.tables中检索数据,因此该解决方案不再对mysql 8起作用。 (2认同)

Cha*_*ara 12

这将返回MySQL数据库的自动增量值,我没有检查其他数据库.请注意,如果您使用任何其他数据库,则查询语法可能会有所不同.

SELECT AUTO_INCREMENT 
FROM information_schema.tables
WHERE table_name = 'your_table_name'
     and table_schema = database();
Run Code Online (Sandbox Code Playgroud)


Sar*_*raz 11

使用LAST_INSERT_ID()从您的SQL查询.

要么

您也可以mysql_insert_id()使用PHP来获取它.

  • 这应该只在插入后工作或我错了吗? (11认同)
  • @Sarfraz:问题是关于**NEXT**id而不是**LAST**,正如你提到的那样提到`LAST_INSERT_ID()`. (8认同)
  • 如果表中的行被删除,最大值将是错误的 (4认同)
  • LAST_INSERT_ID()有时会返回错误的ID (3认同)

Hex*_*men 10

最佳答案使用PHP MySQL_作为解决方案,我想我会分享一个更新的PHP MySQLi_解决方案来实现这一目标.此例程中没有错误输出!

$db = new mysqli('localhost', 'user', 'pass', 'database');
$sql = "SHOW TABLE STATUS LIKE 'table'";
$result=$db->query($sql);
$row = $result->fetch_assoc();

echo $row['Auto_increment'];
Run Code Online (Sandbox Code Playgroud)

开始下表中的下一个自动增量.


Nar*_*ain 9

在PHP中你可以试试这个:

$query = mysql_query("SELECT MAX(id) FROM `your_table_name`");
$results = mysql_fetch_array($query);
$cur_auto_id = $results['MAX(id)'] + 1;
Run Code Online (Sandbox Code Playgroud)

要么

$result = mysql_query("SHOW TABLE STATUS WHERE `Name` = 'your_table_name'");
$data = mysql_fetch_assoc($result);
$next_increment = $data['Auto_increment'];
Run Code Online (Sandbox Code Playgroud)

  • 请记住第一种方法,如果删除了具有最高id的记录,您将创建一个新记录,其ID为已删除的记录. (4认同)
  • 如果删除最后插入的记录,第一个返回错误的 id, (2认同)

小智 6

解:

CREATE TRIGGER `IdTrigger` BEFORE INSERT ON `payments`
  FOR EACH ROW
BEGIN

SELECT  AUTO_INCREMENT Into @xId
    FROM information_schema.tables
    WHERE 
    Table_SCHEMA ="DataBaseName" AND
    table_name = "payments";

SET NEW.`payment_code` = CONCAT("sahf4d2fdd45",@xId);

END;
Run Code Online (Sandbox Code Playgroud)

"DataBaseName"是我们数据库的名称


小智 6

对于 MySQL 8,用于SHOW CREATE TABLE检索下一个自动增量插入 id:

SHOW CREATE TABLE mysql.time_zone

结果:

CREATE TABLE `time_zone` (
  `Time_zone_id` int unsigned NOT NULL AUTO_INCREMENT,
  `Use_leap_seconds` enum('Y','N') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'N',
  PRIMARY KEY (`Time_zone_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1784 DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 ROW_FORMAT=DYNAMIC COMMENT='Time zones'
Run Code Online (Sandbox Code Playgroud)

请参阅返回查询的最后一行的AUTO_INCRMENT=1784 。

与最后插入的值进行比较: select max(Time_zone_id) from mysql.time_zone

结果:

+-------------------+
| max(Time_zone_id) |
+-------------------+
|              1783 |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

在 MySQL v8.0.20 上测试。


Teb*_*ebe 5

SELECT id FROM `table` ORDER BY id DESC LIMIT 1
Run Code Online (Sandbox Code Playgroud)

虽然我怀疑它的生产力,但它是 100% 可靠的


小智 5

简单的查询就可以了 SHOW TABLE STATUS LIKE 'table_name'