如何在MySQL中获取下一个ID以将其插入表中
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
如何在MySQL中获取下一个ID以将其插入表中
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
Answers:
LAST_INSERT_ID()
。
mysqli_insert_id
您可以使用
SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
或者,如果您不想使用information_schema,则可以使用此方法
SHOW TABLE STATUS LIKE 'table_name'
TABLES.AUTO_INCREMENT
已缓存dev.mysql.com/doc/refman/8.0/en/… 。也MySQL的博客有几个后这件事,但他们提到的系统varaible似乎已经过时:mysqlserverteam.com/... mysqlserverteam.com/...
您可以通过执行以下操作获得下一个自动增量值:
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()
追溯的,因此可以在当前连接中得到保证。
该婴儿是准婴儿,因此并非每次连接都唯一,因此不能依靠。
它仅在单个连接数据库中有效,但是今天的单个连接数据库习惯于明天成为多个连接数据库。
insert into table_name (field1, field2) select 'constant', auto_increment from information_schema.tables where table_name = 'table_name'
什么?我会在after insert
触发器中使用更新last_insert_id()
,不过……
UPDATE
如果有的话,我会再跟一个。但是我宁愿在显示时将两者连接起来,并省去所有麻烦。
SHOW TABLE STATUS
预计,database name
后FROM
和'table name pattern'
后LIKE
。
这将为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();
最佳答案是使用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'];
找出表格中出现的下一个自动增量。
在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'];
插入时不能使用ID,也不需要它。当您插入该记录时,MySQL甚至都不知道ID。您可以将其保存"sahf4d2fdd45"
在payment_code
表中并使用,id
然后payment_code
再使用。
如果您确实需要Payment_code包含ID,则在插入后更新该行以添加ID。
information_schema.tables
表中列出。
SELECT ... CONCAT(payment_code, id)
或在应用程序代码中。您甚至可以将包裹在SELECT
中VIEW
,以便始终返回正确的值,而不必担心应用中每个SELECT中的CONCAT。
下一个增量ID需要什么?
MySQL仅允许每个表一个自动递增字段,并且它还必须是保证唯一性的主键。
请注意,当您获得下一个插入ID时,使用该ID可能不可用,因为您拥有的值仅在该事务范围内。因此,根据数据库上的负载,该值可能在下一个请求进入时已被使用。
我建议您检查设计,以确保您无需知道接下来要分配的自动增量值
我建议重新考虑您在做什么。我从未经历过需要特殊知识的单个用例。下一个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());
?>
我希望上面的例子有用。
使用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'
);
@ 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)
对我来说,它很有效,而且看起来很简单:
$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
$last_id
只要可以,就不必重复分配DESC
。您的while
街区进行了大量无用的工作。
auto_increment
专栏