抱歉,如果问题的标题具有误导性或不够准确,但我看不出如何用一句话询问。
假设我们有一个表,其中PK是一个字符串(数字从'100,000'到'999,999',逗号仅用于可读性)。也可以说,PK没有顺序使用。
现在,我想使用java.sql在表中插入新行,并向用户显示插入行的PK。由于默认情况下不生成PK(例如,没有PK的插入值不起作用,在给定的环境中无法使用诸如generate_keys之类的东西),我已经看到了两种不同的方法:
在两个不同的语句中,首先找到一个可能的下一个键,然后尝试插入(并期望另一个事务在两个语句之间的时间中使用相同的键)-重试直到成功是否有效,或者是否有任何SQL技巧可以通过事务执行-设置/锁定在这里有帮助吗?我如何在java.sql中实现呢?
对我来说,这是一个令人失望的解决方案,因为这种行为不确定性(也许您可以说服我相反),所以我寻找了另一个解决方案:
用嵌套的select语句插入,查找下一个可能的PK。在我自己生成PK的过程中查找其他答案,我接近该语句的有效解决方案(省略了从字符串到整数的转换):
INSERT INTO mytable (pk,othercolumns)
VALUES(
(SELECT MIN(empty_numbers.empty_number)
FROM (SELECT t1.pk + 1 as empty_number
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON t1.pk + 1 = t2.pk
WHERE t2.pk IS NULL
AND t1.pk > 100000)
as empty_numbers),
othervalues);
与我的第一种方法类似,它的工作原理很吸引人,并且具有(afaik)更可预测和更稳定的解决方案,但是:如何从该语句中检索生成的PK?我读过没有办法直接返回插入的行(或任何列),并且我发现的大多数google结果都指向返回生成的键-即使我的键是生成的,也不是由DBMS生成的直接,但根据我的陈述。
注意,开发中使用的DBMS是MSSQL 2008,生产系统当前是AS / 400上的DB2(不知道哪个版本),因此我必须遵守SQL标准。我不能以任何方式更改数据库结构(例如,使用生成的键,我不确定存储过程)。
DB2 for i允许生成键,存储过程,用户定义的函数-SQL Server几乎可以做的所有事情。确切的实现有所不同,但是那是手册的目的:-)询问您的管理员他们正在运行的IBM i版本,然后查阅信息中心以获取详细信息。
制约因素是您不能更改数据库设计;您似乎在尝试在插入现有键空间中的“空洞”时进行插入的多个进程中陷入困境。这是一个很难克服的难题。因为您不能更改数据库设计,所以除了允许和处理PK冲突之外,没有其他事情要做。没有SQL技巧会有所帮助-SQL的方法是让数据库生成PK,而不是应用程序。
如果允许某些更改,则有几种建议。所有人都有需要解决的问题,但是由于应用程序设计,在这一点上这是不可避免的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句