MySQL-当使用表生成器策略时,如何从存储过程中检索下一个可用的序列值?

MySQL-当使用表生成器策略时,如何从存储过程中检索下一个可用的序列值?,mysql,stored-procedures,primary-key,sequence,Mysql,Stored Procedures,Primary Key,Sequence,我有一个MySQL表,它使用JPA检索应用程序代码中下一个可用的主键值 但是有一个与此表相关的特殊情况,在这种情况下,我需要从存储过程向此表插入一条新记录。这意味着存储过程必须在插入记录之前检索该表的下一个可用PK值 虽然我知道如何使用表生成器策略检索下一个可用的PK值,但我不确定如何从存储过程检索下一个可用的PK值 我只需要使用一个 SELECT current value + 1 FROM (Table Generator Table) WHERE (table generator rec

我有一个MySQL表,它使用JPA检索应用程序代码中下一个可用的主键值

但是有一个与此表相关的特殊情况,在这种情况下,我需要从存储过程向此表插入一条新记录。这意味着存储过程必须在插入记录之前检索该表的下一个可用PK值

虽然我知道如何使用表生成器策略检索下一个可用的PK值,但我不确定如何从存储过程检索下一个可用的PK值

我只需要使用一个

SELECT current value + 1 FROM (Table Generator Table) 
WHERE (table generator record for this table) FOR UPDATE;
及 然后

?


有更好的方法吗?

一个想法是让INSERT语句不指定PK列,让数据库通过autoincrement填充缺少的值,并可以选择使用RETURNING子句(或等效的MYSQL方法)检索它得到的值。使用autoincrement的问题是,此应用程序用于Oracle和MySQL。在Oracle或MySQL中使用应用程序时,我们使用不同的ORM文件来映射生成器策略。因此,如果我们对MySQL使用AUTOINCREMENT,而对Oracle使用sequence策略,那么我们必须添加许多if条件等并自定义代码。但是,表生成器需要独立的第二个事务来获取序列号,对吗?不确定是否可以在MySQL存储过程中执行此操作。或者,您可以在同一事务中执行此操作。仍然可以工作,但可能会导致并发问题(每个人都需要等待您的事务完成,然后才能获得下一个数字)。此外,如果您使用的是Oracle 12,您最终也可以让数据库处理它:一个想法是让INSERT语句的PK列保持未指定状态,让数据库通过autoincrement来填充缺少的值,并可以选择使用RETURNING子句(或等效的MYSQL方法)检索它得到的值。使用autoincrement的问题是,该应用程序同时用于Oracle和MYSQL。在Oracle或MySQL中使用应用程序时,我们使用不同的ORM文件来映射生成器策略。因此,如果我们对MySQL使用AUTOINCREMENT,而对Oracle使用sequence策略,那么我们必须添加许多if条件等并自定义代码。但是,表生成器需要独立的第二个事务来获取序列号,对吗?不确定是否可以在MySQL存储过程中执行此操作。或者,您可以在同一事务中执行此操作。仍然可以工作,但可能会导致并发问题(每个人都需要等待事务完成,然后才能获得下一个数字)。此外,如果您使用的是Oracle 12,则最终也可以让数据库处理它:
UPDATE (Table Generator Table) SET current value = current value + 1
WHERE (table generator record for this table)