从插入语句返回(自身)生成的值(无id,无返回)

克里斯蒂安·R。

抱歉,如果问题的标题具有误导性或不够准确,但我看不出如何用一句话询问。

假设我们有一个表,其中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,而不是应用程序。

如果允许某些更改,有几种建议所有人都有需要解决的问题,但是由于应用程序设计,在这一点上这是不可避免的。

  1. 创建所有INSERT客户端都用来检索下一个可用PK的UDF。使用“可用数字”表并在发布时将其删除。
  2. 预插入所有可用数字。强制客户端执行UPDATE。使它们在FETCH ... FOR UPDATE位置(其余数据=未填充)。这将锁定行,避免冲突,并使PK立即可用。
  3. 保持数据库和其他使用该表的应用程序的状态不变,但是INSERT流程将从为您使用而预留的一组键中提取。将下一个可用数字保留在SQL SEQUENCE或IBM i数据区域中。这仅在键空间中有一个尚未使用的非常大的孔时才有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入无值的行以获取生成的ID

来自分类Dev

插入无值的行以获取生成的ID

来自分类Dev

根据返回值执行更新/插入语句

来自分类Dev

函数返回无值

来自分类Dev

是否可以在returning子句中从Postgresql插入语句返回ID数组?

来自分类Dev

get_user(id)找不到用户-返回无(自身bot discord.py)

来自分类Dev

cypher语句返回(无更改,无行)

来自分类Dev

输入内部的打印语句返回“无”

来自分类Dev

psql插入语句返回令人困惑的错误

来自分类Dev

Sqlalchemy 核心,插入语句返回 *(所有列)

来自分类Dev

INDEX 返回错误值且无值

来自分类Dev

R函数,无返回值

来自分类Dev

限制从SQL查询返回无值

来自分类Dev

返回无值的Python JSON(Telegram API)

来自分类Dev

类型检查是否返回无值的函数

来自分类Dev

R函数,无返回值

来自分类Dev

python - 返回返回无

来自分类Dev

区分没有返回值和返回无

来自分类Dev

扩展列表返回无

来自分类Dev

wtforms仅返回无

来自分类Dev

递归代码返回无

来自分类Dev

ManyRelatedManager返回无

来自分类Dev

AppIdentityService :: getApplicationId返回“无”

来自分类Dev

美丽的汤返回“无”

来自分类Dev

ElementTree查找返回“无”?

来自分类Dev

BeautifulSoup返回“无”

来自分类Dev

BeautfilSoup返回“无”

来自分类Dev

Django Authenticate返回无

来自分类Dev

Python打印返回无