gpt4 book ai didi

sql-server - 如果记录不存在,插入记录的最佳做法是什么?

转载 作者:行者123 更新时间:2023-12-05 00:06:43 24 4
gpt4 key购买 nike

如果表中不存在记录,我至少知道三种插入记录的方法:

  • 第一个是如果不存在则使用:
    IF NOT EXISTS(select 1 from table where <condition>)
    INSERT...VALUES
  • 第二个是使用合并:
    MERGE table AS target  
    USING (SELECT values) AS source
    ON (condition)
    WHEN NOT MATCHED THEN
    INSERT ... VALUES ...
  • 第三个是使用插入...选择:
    INSERT INTO table (<values list>)
    SELECT <values list>
    WHERE NOT EXISTS(select 1 from table where <condition>)

  • 但哪一个是最好的?

    第一个选项似乎不是线程安全的,因为如果两个或多个用户尝试插入同一条记录,则记录可能会插入 if 中的 select 语句和随后的 insert 语句之间。

    至于第二个选项,合并似乎是一种矫枉过正的做法,因为 documentation状态:

    Performance Tip: The conditional behavior described for the MERGE statement works best when the two tables have a complex mixture of matching characteristics. For example, inserting a row if it does not exist, or updating the row if it does match. When simply updating one table based on the rows of another table, improved performance and scalability can be achieved with basic INSERT, UPDATE, and DELETE statements.



    所以我认为第三个选项最适合这种情况(如果记录不存在则只插入记录,如果存在则不需要更新),但我想知道 SQL Server 专家的想法。

    请注意,在插入之后,我不想知道该记录是否已经存在,或者它是否是一个全新的记录,我只需要它在那里,以便我可以继续执行其余的存储过程。

    最佳答案

    当您需要在不能由 UNIQUE 或 PRIMARY KEY 约束表示的条件下保证记录的唯一性时,您确实需要确保在一个事务中完成存在检查和插入。您可以通过以下任一方式实现此目的:

  • 使用一个 SQL 语句执行检查和插入(您的第三个选项)
  • 使用具有适当隔离级别的事务

  • 还有第四种方法可以帮助您更好地构建代码,并使其在需要一次处理一批记录的情况下工作。您可以创建一个 TABLE 变量或一个临时表,将所有需要插入的记录插入其中,然后根据该变量编写 INSERT、UPDATE 和 DELETE 语句。

    下面是演示这种方法的(伪)代码:
    -- Logic to create the data to be inserted if necessary

    DECLARE @toInsert TABLE (idCol INT PRIMARY KEY,dataCol VARCHAR(MAX))
    INSERT INTO @toInsert (idCol,dataCol) VALUES (1,'row 1'),(2,'row 2'),(3,'row 3')

    -- Logic to insert the data

    INSERT INTO realTable (idCol,dataCol)
    SELECT TI.*
    FROM @toInsert TI
    WHERE NOT EXISTS (SELECT 1 FROM realTable RT WHERE RT.dataCol=TI.dataCol)

    在许多情况下,我使用这种方法,因为它使 TSQL 代码更易于阅读,可以重构和应用单元测试。

    关于sql-server - 如果记录不存在,插入记录的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38497259/

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