1

私は(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のPositionのMAX + 1を取得し、それを新しいレコードに割り当てています。問題は、同時挿入操作の結果、位置の値が同じになることが多いことです。

一意性のために挿入トリガーの位置をインクリメントしようとしましたが、LINQは更新された値を自動的に反映しません。

LINQ-to-SQLを介して、またはTSQLクエリとして直接これを修正するにはどうすればよいですか?

どんな助けでも大歓迎です。ありがとう!

4

3 に答える 3

0

TSQLクエリについてお話しします。IDENT_CURRENTを使用できます 。これにより、誰でもテーブルに最後に挿入したIDが得られます。それがあなたが望むものではない場合は試してみてください-SCOPE_IDENTITY

于 2012-04-12T14:32:01.073 に答える
0

私の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
于 2012-04-18T13:36:04.113 に答える
0

とに一意の制約を追加して、重複を防ぐことができます。 CompanyIDPosition

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

重複の代わりに例外が発生し、コードで再試行などの何かを行うことができます。

于 2012-04-18T15:20:50.257 に答える