如果基于三列的记录与最新版本的记录不匹配,是否可以在SQL Server中插入记录?

安东尼·伊科诺

考虑下表UserAttributes

+----+--------+----------+-----------+
| Id | UserId | AttrName | AttrValue |
+----+--------+----------+-----------+
|  4 |      1 | FavFood  | Apples    |
|  3 |      2 | FavFood  | Burgers   |
|  2 |      1 | FavShape | Circle    |
|  1 |      1 | FavFood  | Chicken   |
+----+--------+----------+-----------+

如果用户特定属性的最新版本的值与最新值不匹配,我想在此表中插入新记录。

我的意思是,例如,如果要这样做的话: SELECT TOP(1) * FROM [UserAttributes] WHERE [UserId] = 1 AND [AttrName] = 'FavFood' ORDER BY [Id] DESC

我将看到用户ID 1当前最喜欢的食物是“苹果”。

是否有一个安全的并发查询,仅在与该用户的当前收藏食物不匹配时才插入新的收藏食物?

我尝试将MERGE查询与一起使用HOLDLOCK,但问题是WHEN MATCHED/ WHEN NOT MATCHED,并且如果用户在先前将自己喜欢的食物(在此示例中)设置为新值后再也不想插入新记录,则可以使用该查询但是,它不认为用户可能会切换到新的喜爱的食物,然后又变回他们的旧喜爱的食物。我想保留所有更改作为历史记录。

在上面的数据集中,如果用户ID 1的新喜欢的食物是“汉堡”,我想插入一条新记录,但是如果他们的新喜欢的食物是“苹果”,我不想插入一条记录(因为这是他们的目前最喜欢的食物)。我还想确保此操作的并发性。

感谢您的帮助!

编辑:我可能还应该提到,当我将此操作分为两个查询时(即:首先选择他们当前喜欢的食物,然后仅在检测到新食物时才执行插入查询),它在正常情况下可以工作。但是,我们正在观察竞争条件(因此有重复的情况),因为(您可能已经猜到)上面的数据集只是一个示例,并且该表上同时有许多线程在运行。

西恩

有点难看,但这样做的一个命令,你可以插入用户的(新)最喜欢的食物,但过滤器与EXCEPT及其当前值。

例如,(假设用户的新数据位于@ UserID,@ FavFood中

; WITH LatestFavFood AS
    (SELECT TOP(1) UserID, AttrName, AttrValue 
      FROM  [UserAttributes] 
      WHERE [UserId] = @UserID AND [AttrName] = 'FavFood' 
      ORDER BY [Id] DESC
     )
INSERT INTO UserAttributes (UserID, AttrName, AttrValue)
    SELECT  @UserID, 'FavFood', @FavFood
  EXCEPT
    SELECT  UserID, AttrName, AttrValue
    FROM    LatestFavFood

这是一个具有三个运行DB_Fiddle

编辑:我已经更改了上面,以假定AttrName而不是nvarchar的varchar类型。小提琴有混合物。确保您输入正确无误(尤其是食物,因为它可能具有特殊字符),这将是很好的。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查询Microsoft Access中记录的最新版本

来自分类Dev

在SQL中获取特定记录列表的最新版本的最佳方法

来自分类Dev

presto/aws athena - 选择记录的最新版本

来自分类Dev

使用SQL有效查询记录的最新版本

来自分类Dev

使用Facebook SDK的应用日志记录最新版本

来自分类Dev

如何使用SQL Server在现有列中插入记录

来自分类Dev

在SQL Server中选择最新插入的记录

来自分类Dev

在不积累更新历史记录的情况下将子模块更新为最新版本

来自分类Dev

使用查询在SQL Server 2008中插入5000条记录

来自分类Dev

SQL Server 2008在表中插入缺少日期的新记录

来自分类Dev

如何从SQL Server的sqlite中插入更新的记录

来自分类Dev

插入之前删除SQL Server表中的记录

来自分类Dev

在SQL Server中插入带有违规的记录

来自分类Dev

根据最近的日期在SQL Server中插入记录

来自分类Dev

最新版本的Typescript中是否有任何可以简化函数链接的内容?

来自分类Dev

Jenkins管道在Multibranch设置中是否可以自动签出最新版本的分支?

来自分类Dev

在最新版本的Ubuntu中是否可以使用非Pae内核?

来自分类Dev

最新版本的Typescript中是否有任何可以简化函数链接的内容?

来自分类Dev

在水线中插入记录

来自分类Dev

在水线中插入记录

来自分类Dev

如果记录不存在,则在SQL中插入记录

来自分类Dev

如果列不包含数组中的值,则插入新记录

来自分类Dev

更新数百万条记录而不插入时如何防止SQL Server中的日志增长

来自分类Dev

SQL Server 2008 R2中的“插入”记录绑定是否存在延迟?

来自分类Dev

访问“插入记录”内容中的记录

来自分类Dev

插入/更新海量记录SQL Server

来自分类Dev

插入除sql server外的记录

来自分类Dev

在表单中插入新记录后保持记录为最新

来自分类Dev

无法在MongoDB中插入记录

Related 相关文章

  1. 1

    查询Microsoft Access中记录的最新版本

  2. 2

    在SQL中获取特定记录列表的最新版本的最佳方法

  3. 3

    presto/aws athena - 选择记录的最新版本

  4. 4

    使用SQL有效查询记录的最新版本

  5. 5

    使用Facebook SDK的应用日志记录最新版本

  6. 6

    如何使用SQL Server在现有列中插入记录

  7. 7

    在SQL Server中选择最新插入的记录

  8. 8

    在不积累更新历史记录的情况下将子模块更新为最新版本

  9. 9

    使用查询在SQL Server 2008中插入5000条记录

  10. 10

    SQL Server 2008在表中插入缺少日期的新记录

  11. 11

    如何从SQL Server的sqlite中插入更新的记录

  12. 12

    插入之前删除SQL Server表中的记录

  13. 13

    在SQL Server中插入带有违规的记录

  14. 14

    根据最近的日期在SQL Server中插入记录

  15. 15

    最新版本的Typescript中是否有任何可以简化函数链接的内容?

  16. 16

    Jenkins管道在Multibranch设置中是否可以自动签出最新版本的分支?

  17. 17

    在最新版本的Ubuntu中是否可以使用非Pae内核?

  18. 18

    最新版本的Typescript中是否有任何可以简化函数链接的内容?

  19. 19

    在水线中插入记录

  20. 20

    在水线中插入记录

  21. 21

    如果记录不存在,则在SQL中插入记录

  22. 22

    如果列不包含数组中的值,则插入新记录

  23. 23

    更新数百万条记录而不插入时如何防止SQL Server中的日志增长

  24. 24

    SQL Server 2008 R2中的“插入”记录绑定是否存在延迟?

  25. 25

    访问“插入记录”内容中的记录

  26. 26

    插入/更新海量记录SQL Server

  27. 27

    插入除sql server外的记录

  28. 28

    在表单中插入新记录后保持记录为最新

  29. 29

    无法在MongoDB中插入记录

热门标签

归档