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

时间:2011-07-20 11:50:10

标签: mysql sql

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

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

21 个答案:

答案 0 :(得分:235)

您可以使用

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

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

SHOW TABLE STATUS LIKE 'table_name'

答案 1 :(得分:44)

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

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

请注意,您应该使用它来更改表格,而是使用auto_increment列自动执行此操作。
问题是last_insert_id()是回顾性的,因此可以在当前连接中得到保证 这个婴儿是有前途的,因此不是每个连接都是独一无二的,不能依赖它 只有在一个连接数据库中它才能工作,但是今天单个连接数据库有一种习惯,明天就会成为多个连接数据库。

请参阅:SHOW TABLE STATUS

答案 2 :(得分:12)

使用SQL查询中的LAST_INSERT_ID()

或者

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

答案 3 :(得分: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'];

在表格中显示下一个自动增量。

答案 4 :(得分:9)

在PHP中你可以试试这个:

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

OR

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

答案 5 :(得分:8)

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

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

答案 6 :(得分: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;

“DataBaseName”是我们数据库的名称

答案 7 :(得分:4)

您可以使用mysql trigger

答案 8 :(得分:4)

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

答案 9 :(得分:3)

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

如果您确实需要您的payment_code中包含ID,请在插入后更新行以添加ID。

答案 10 :(得分:3)

我建议重新考虑你在做什么。我从未经历过需要特殊知识的单一用例。下一个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;

答案 11 :(得分:3)

您需要下一个增量ID?

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

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

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

答案 12 :(得分:2)

使用“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());
    ?>

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

答案 13 :(得分:2)

您必须连接到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"];  

答案 14 :(得分:2)

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

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

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

结果:

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

在 MySQL v8.0.20 上测试。

答案 15 :(得分:1)

mysql_insert_id();

那就是:)

答案 16 :(得分:1)

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

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

答案 17 :(得分:1)

使用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

在插入查询中使用,创建SHA1哈希。例如:

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

答案 18 :(得分:0)

@ 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_increment_offset的可选值,或默认为1:IFNULL(@ @ auto_increment_offset,1)

答案 19 :(得分:0)

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

 $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

答案 20 :(得分:0)

如果未返回正确的AUTO_INCREMENT,请尝试:

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

BD的表清除缓存