如何获取mysql中的下一个id以将其插入表
INSERT INTO payments (date, item, method, payment_code)
VALUES (NOW(), '1 Month', 'paypal', CONCAT("sahf4d2fdd45", id))
答案 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()
是回顾性的,因此可以在当前连接中得到保证
这个婴儿是有前途的,因此不是每个连接都是独一无二的,不能依赖它
只有在一个连接数据库中它才能工作,但是今天单个连接数据库有一种习惯,明天就会成为多个连接数据库。
答案 2 :(得分:12)
答案 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
表中,然后再使用id
和payment_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的表清除缓存