在MySQL中查找AUTO_INCREMENT列的下一个值。

8
我正在使用MySQL。 我想要获取AUTO_INCREMENT列将采用的下一个值,而不需要输入新记录。
create table ABC(id int(10) NOT NULL AUTO_INCREMENT,name char(10));

在Oracle中,我会使用sequencename.nextval();。但是在MySQL中应该使用什么呢?
以下是我为什么没有使用的原因。
select max(id) from ABC;

假设我有一个id为2的记录。现在,列id将取下一个值3。 在我创建一个id为3的记录之前,如果我删除了id为2的记录。 我提到的查询的答案将是2。但是我想要实际的值3,无论如何auto_increment列都会取到。

我想要获取一个值,但这些答案只是打印了一个描述,而不是可检索的值。 - Xperiaz X
http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/ - Mihai
使用以下代碼:SELECT (IFNULL(max(id),0) + 1 ) as id from table。如果表中沒有記錄,IFNULL將會很有幫助。 - Eugine Joseph
3个回答

9

查询表状态的方式如下:

SHOW TABLE STATUS WHERE `Name` = 'table_name'

现在,您将获得一个名为Auto_increment的列。这就是您所要求的值。

在JAVA中:

conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword);
stmt = conn.createStatement();
rs = stmt.executeQuery("SHOW TABLE STATUS WHERE `Name` = 'table_name'");
rs.next();
String nextid = rs.getString("Auto_increment");

完整示例请参考: http://www.avajava.com/tutorials/lessons/how-do-i-use-jdbc-to-query-a-mysql-database.html


是的,它正在输出。我如何从显示的状态中检索该值? select auto_increment from(SHOW TABLE STATUS WHERE Name = 'table_name') 不起作用。 - Xperiaz X
Java使用JDBC。我想要在ResultSet中仅接收值作为结果。 - Xperiaz X
Use it as edited above. - Flash Thunder
哦,抱歉,查询错误了,代码已修复...别忘了将 table_name 更改为你的表名。 - Flash Thunder
是的,这比模式搜索简单。非常感谢。 - Xperiaz X
显示剩余2条评论

1
如果我理解正确,您可以使用行数作为指示器:
SELECT TABLE_ROWS+1
FROM information_schema.tables 
WHERE table_name='tableName'
AND table_schema = DATABASE();

0

在插入行之前,没有办法保证你会得到什么值。这主要是因为你必须锁定整个表才能确保没有其他线程将使用“你”的下一个值进行插入。

你可以通过启动事务、插入一行、获取该值,然后回滚来保留该值。然后你可以安全地使用该值。

直接插入行会更简单,所以也许我不理解你正在做的目的。


我想执行将插入查询到另一个表中,检查其是否有效,然后再将其插入到此表中。 - Xperiaz X
最好的方法是使用事务。如果你在使用MyISAM,我能想到的最好方法是插入行,获取自增值,<执行其他操作>,如果失败则删除该行。 - Vatev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接