【问题标题】:Increment Record Position in Database (via LINQ or TSQL)增加数据库中的记录位置(通过 LINQ 或 TSQL)
【发布时间】:2012-04-12 07:12:00
【问题描述】:

我有一个表(在 SQL Server 中),例如:

UserId    CompanyId    UserName    Position
     1            1    John        1
     2            2    Adam        1
     3            2    Nick        2
     4            1    Mark        2
     5            3    Jack        1

UserId 是具有自动增量的 PK。 CompanyID 是一个 FK。位置只是用户(每个公司)的顺序计数器。

当为公司插入新的用户记录(通过 LINQ)时,我希望职位也增加。目前,我获得给定 CompanyId 的职位的 MAX+1,然后将其分配给新记录。问题是并发插入操作通常会导致相同的位置值。

我尝试增加插入触发器中的位置以获得唯一性,但 LINQ 不会自动反映更新后的值。

如何通过 LINQ-to-SQL 或直接作为 TSQL 查询来解决此问题?

感谢任何帮助。谢谢!

【问题讨论】:

  • 您是否尝试过在设置位置时使用 db 事务获取表的排他锁?
  • @ShoaibShaikh 我试图避免锁定表,但我会看看将其包装在事务中。
  • 设置IsDbGenerated to trueAutoSync to OnInsert可以返回触发解决方案

标签: sql sql-server linq tsql linq-to-sql


【解决方案1】:

我可以告诉你有关 TSQL 查询的信息。 您可以使用 IDENT_CURRENT - 为您提供任何人插入表的最后一个 id。 如果这不是你想要的,那就试试 - SCOPE_IDENTITY

【讨论】:

    【解决方案2】:

    我的 2 美分:

    begin transaction
        declare @v int
        select @v = isnull((select max(field2)+1 from t1), 1)
        insert into t1 (field2) values (@v)
    commit transaction
    
    -- just checking
    select * from t1
    

    【讨论】:

      【解决方案3】:

      您可以在CompanyIDPosition 上添加unique constraint 以防止重复。

      create table Users
      (
        UserId int identity primary key,
        CompanyId int not null,
        UserName char(10) not null,
        Position int not null,
        unique(CompanyId, Position)
      )
      

      你得到一个异常而不是重复,你可以在你的代码中做一些事情,比如重试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-20
        相关资源
        最近更新 更多