当前位置: 首页 > 面试题库 >

仅在尚未插入的行插入

龙玺
2023-03-14
问题内容

我一直使用类似于以下内容的方法来实现它:

INSERT INTO TheTable
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WHERE
        PrimaryKey = @primaryKey)

…但是一旦加载,就会发生主键冲突。这是唯一插入到该表中的唯一语句。那么这是否意味着上述陈述不是原子的?

问题在于,这几乎不可能随意重建。

也许我可以将其更改为以下内容:

INSERT INTO TheTable
WITH
    (HOLDLOCK,
    UPDLOCK,
    ROWLOCK)
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WITH
        (HOLDLOCK,
        UPDLOCK,
        ROWLOCK)
    WHERE
        PrimaryKey = @primaryKey)

虽然,也许我使用了错误的锁,或者使用了过多的锁之类的东西。

看到了其他问题,那里的答案都提示“ IF(SELECT COUNT(*)…INSERT”等),但我始终处于(也许不正确)的假设,即单个SQL语句是原子性的。

有人有什么想法吗?


问题答案:

那“ JFDI”模式呢?

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

认真地说,这是最快且最并发的无锁操作,尤其是在大容量情况下。如果UPDLOCK升级并且整个表被锁定怎么办?



 类似资料:
  • 本文向大家介绍在MySQL中仅使用默认值插入行,包括了在MySQL中仅使用默认值插入行的使用技巧和注意事项,需要的朋友参考一下 在创建表时使用DEFAULT关键字,只要您不为该列提供值,它将插入默认值。 让我们首先创建一个表。在这里,对于ClientAge,我们设置了默认值24:首先让我们创建一个表。在这里,对于ClientAge,我们设置了默认值24- 使用insert命令在表中插入一些记录。对

  • 我们遇到了遗留代码的问题。对于“username”字段有一个验证集,验证其长度并确保至少包含一个字母: 我们面临的问题是,一些现有的遗留数据不适合这些验证,我试图找到一种方法,使这些验证对遗留数据(老用户)被忽略,而仍然适用于新创建的用户。 我正在考虑将验证移到方法(因此仅在实际更改时验证值),但这导致了一个异常:

  • 问:有没有一种方法可以在PostgreSQL表中使用所有列的默认值插入行,而不指定任何列名? 背景:如果我有一个表,其中有两列都有默认值(或者简单地接受NULL),如果我希望行的值是默认值,我可以在插入行时省略列名。例如: 有办法做到这一点还是明令禁止?我找不到这种案子的任何文件。谢了!

  • 问题内容: 我在Java 8u40中测试了Spinner控件 我如何只能在微调器控制字段中插入数字? 现在,我可以插入数字和文本了。有没有可以作为例子的例子? 问题答案: 对该要求尚不完全确定-假设您要防止输入无法解析为有效Number的字符。 如果是这样,可以轻松使用Spinner编辑器中的TextFormatter:有了它,您将监视文本的任何更改并接受或拒绝。该决定封装在格式器的过滤器中。一个

  • 问题内容: 我们遇到了遗留代码问题。有一个用于“用户名”字段的验证集,用于验证其长度并确保其至少包含一个字母: 我们面临的问题是,一些现有的旧数据不适合这些验证,我正在尝试找到一种方法,使旧数据(旧用户)可以忽略这些验证,同时仍将这些验证应用于新创建的用户。 我正在考虑将验证移至方法(因此将仅在实际更改时验证值),但这导致了异常: 我还确保将实体设置为,但这无济于事,因为hibernate会验证所

  • 问题内容: 更新: 使用sed,如何在每个文件的关键字的第一个匹配项上插入(不替换)新行。 目前,我有以下内容,但此代码会插入包含匹配关键字的每一行,并且我希望它仅针对文件中找到的第一个匹配项插入“新插入行”: 例如: Myfile.txt: 变成: 问题答案: 如果要使用sed *: *仅适用于GNU sed