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

如何让 mysql 中的下一个 id 插入到表中

INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
271607 次浏览

在 SQL 查询中使用 LAST_INSERT_ID()

或者

您还可以使用 mysql_insert_id()来使用 PHP 获得它。

插入时不能使用 ID,也不需要它。当您插入该记录时,MySQL 甚至不知道 ID。您可以将 "sahf4d2fdd45"保存在 payment_code表中,稍后再使用 idpayment_code

如果您确实需要 pay _ code 中包含 ID,那么在插入之后更新该行以添加 ID。

你可以通过以下方法得到 下一个的自动递增值:

SHOW TABLE STATUS FROM tablename LIKE Auto_increment
/*or*/
SELECT `auto_increment` FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = 'tablename'

请注意,您应该使用 没有来修改表,而应该使用 auto _  增加一列來自動完成此工作。
问题是 last_insert_id()是回溯的,因此可以在当前连接中得到保证。
这个婴儿是前瞻性的,因此不是唯一的每个连接,不能依赖。
只有在单个连接数据库中它才能工作,但是今天的单个连接数据库习惯于明天变成多个连接数据库。

见: SHOW TABLE STATUS

您必须连接到 MySQL 并选择一个数据库,然后才能执行此操作

$table_name = "myTable";
$query = mysql_query("SHOW TABLE STATUS WHERE name='$table_name'");
$row = mysql_fetch_array($query);
$next_inc_value = $row["AUTO_INCREMENT"];

解决方案:

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;

“ DataBaseName”是数据库的名称

您需要下一个增量 ID 做什么?

MySQL 只允许每个表有一个自动增量字段,它还必须是保证唯一性的主键。

请注意,当您获得下一个插入 ID 时,它可能在您使用它时不可用,因为您拥有的值只在该事务的范围内。因此,根据数据库上的负载,该值可能在下一个请求进入时已经使用。

我建议您回顾一下您的设计,以确保您不需要知道下一个分配哪个自动增量值

在 PHP 中,您可以尝试这样做:

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

或者

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

你可以用

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;

或者,如果您不希望使用 information _ schema,可以使用

SHOW TABLE STATUS LIKE 'table_name'

顶部的答案使用 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'];

踢出表中出现的下一个 Auto 增量。

我建议你重新考虑一下你在做什么。我从来没有经历过需要特殊知识的单一用例。下一个 id 是一个非常特殊的实现细节,我不指望它是 ACID 安全的。

做一个简单的事务,用最后一个 id 更新插入的行:

BEGIN;


INSERT INTO payments (date, item, method)
VALUES (NOW(), '1 Month', 'paypal');


UPDATE payments SET payment_code = CONCAT("sahf4d2fdd45", LAST_INSERT_ID())
WHERE id = LAST_INSERT_ID();


COMMIT;

使用“ mysql _ insert _ id ()”。Mysql _ insert _ id ()作用于最后执行的查询,请确保在生成该值的查询之后立即调用 mysql _ insert _ id ()。

下面是使用的例子:

<?php
$link = mysql_connect('localhost', 'username', 'password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db('mydb');


mysql_query("INSERT INTO mytable  VALUES('','value')");
printf("Last inserted record has id %d\n", mysql_insert_id());
?>

我希望上面的例子是有用的。

mysql_insert_id();

就是这样:)

SELECT id FROM `table` ORDER BY id DESC LIMIT 1

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

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

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

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = 'your_database_name';


SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'your_table_name'
and table_schema = database();

使用 ravi404的答案:

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
RETURNS BIGINT
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN


DECLARE Value BIGINT;


SELECT
AUTO_INCREMENT INTO Value
FROM
information_schema.tables
WHERE
table_name = TableName AND
table_schema = DATABASE();


RETURN Value;


END

在插入查询中使用,以创建 SHA1Hash.ex. :

INSERT INTO
document (Code, Title, Body)
VALUES (
sha1( getAutoincrementalNextval ('document') ),
'Title',
'Body'
);

对@ravi404的改进,以防自动增量偏移量不是1:

SELECT (`auto_increment`-1) + IFNULL(@@auto_increment_offset,1)
FROM INFORMATION_SCHEMA.TABLES
WHERE table_name = your_table_name
AND table_schema = DATABASE( );

(auto_increment-1) : db 引擎似乎总是考虑1的偏移量。因此,您需要抛弃这个假设,然后将@@ auto _  增量 _ 抵消值(或者默認為1)加入到1中: IFNULL (@@ auto _  增量 _ 抵消值,1)

对我来说,这很有效,而且看起来很简单:

 $auto_inc_db = mysql_query("SELECT * FROM my_table_name  ORDER BY  id  ASC ");
while($auto_inc_result = mysql_fetch_array($auto_inc_db))
{
$last_id = $auto_inc_result['id'];
}
$next_id = ($last_id+1);




echo $next_id;//this is the new id, if auto increment is on

如果没有返回正确的 AUTO _ INCREMENT,请尝试:

ANALYZE TABLE `my_table`;
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE (TABLE_NAME = 'my_table');

这个表的清晰缓存,在 BD 中

对于 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'

请参见返回查询的最后一行的 自动增量 = 1784

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

结果:

+-------------------+
| max(Time_zone_id) |
+-------------------+
|              1783 |
+-------------------+

在 MySQL v8.0.20上测试。

SELECT AUTO _ INCREMENT AS next _ id FROM information _ schema. tables WHERE table _ name = ‘ 表名’AND table _ schema = ‘ 表名的数据库名