gpt4 book ai didi

java - 从插入语句返回(自己)生成的值(无 ID,无返回)

转载 作者:行者123 更新时间:2023-11-29 08:55:32 25 4
gpt4 key购买 nike

抱歉,如果问题标题有误导性或不够准确,但我没有看到如何用一句话来问。

假设我们有一个表,其中 PK 是一个字符串(数字从“100,000”到“999,999”,逗号仅用于提高可读性)。也可以说,PK 不是按顺序使用的。

现在我想使用 java.sql 向表中插入一个新行,并向用户显示插入行的主键。由于 PK 不是默认生成的(例如,没有 PK 的插入值不起作用,generated_keys 之类的东西在给定环境中不可用)我看到了两种不同的方法:

在两个不同的语句中,首先找到一个可能的下一个键,然后尝试插入(并期望另一个事务在两个语句之间的时间使用相同的键) - 重试直到成功是否有效或任何sql技巧在这里有交易设置/锁帮助?我如何在 java.sql 中实现这一点?

对我来说,这是一个令人失望的解决方案,因为存在不确定性行为(也许你可以说服我相反),所以我搜索了另一个解决方案:

插入一个嵌套的选择语句,查找下一个可能的 PK。查找有关自己生成 PK 的其他答案,我接近于使用该语句的工作解决方案(省略了从字符串到 int 的转换):

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?我读过没有办法直接返回插入的行(或任何列),我发现的大多数谷歌结果都指向返回生成的 key ——即使我的 key 是生成的,它不是由 DBMS 生成的直接,但通过我的陈述。

请注意,开发中使用的 DBMS 是 MSSQL 2008,而生产系统目前是 AS/400 上的 DB2(不知道是哪个版本),因此我必须严格遵守 SQL 标准。我无法以任何方式更改数据库结构(例如,使用生成的 key ,我不确定存储过程)。

最佳答案

DB2 for i 允许生成键、存储过程、用户定义的函数——几乎所有 SQL Server 可以做的事情。确切的实现是不同的,但这就是手册的用途:-) 询问您的管理员他们正在运行什么版本的 IBM i,然后点击 Infocenter具体情况。

限制因素是您不能更改数据库设计;在现有 key 空间中回填“漏洞”的同时,您明显被多个进程试图插入。这是一个非常棘手的问题。因为您无法更改数据库设计,所以除了允许和处理 PK 冲突之外别无他法。没有有用的 SQL 技巧 - SQL 方法是让数据库生成 PK,而不是应用程序。

如果允许一些更改,则有几个备选方案可供建议。所有问题都需要解决方法,但由于应用程序设计,目前这是不可避免的。

  1. 创建一个 UDF,所有 INSERT 客户端都使用它来检索下一个可用的 PK。使用“可用号码”表并在发布时将其删除。
  2. 预先插入所有可用的数字。强制客户端进行更新。让它们 FETCH...FOR UPDATE where (rest of data = not populated)。这将锁定该行,避免碰撞并使 PK 立即可用。
  3. 让 DB 和其他应用程序按原样使用此表,但让您的 INSERT 进程从预留供您使用的键 block 中抽取。将下一个可用编号保留在 SQL SEQUENCE 或 IBM i 数据区域中。这仅在 key 空间中有一个尚未使用的非常大的空洞时才有效。

关于java - 从插入语句返回(自己)生成的值(无 ID,无返回),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20460613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com