0

Insert で起動されるトリガーがあります。このトリガーは、別のテーブルに挿入します。ここに私のコードがあります:

    SELECT @maxTeamId = 0
SELECT @maxTeamId = ISNULL(MAX(teamId), 0) from [dbo].[tblTeamslist]

--- Check if home team has already been inserted into the table.
SELECT @homeTeamId = -1
SELECT 
    @homeTeamId = teamId 
FROM 
    [dbo].[tblTeamslist] t
    JOIN inserted i
    ON t.teamName = i.hometeam
IF (@homeTeamId = -1) 
BEGIN
  SET IDENTITY_INSERT tblteamslist ON
    SELECT @homeTeamId = @maxTeamId + 1
    SELECT @maxTeamId = @maxTeamId + 1
    INSERT INTO [dbo].[tblTeamslist] (teamid,teamname) SELECT @homeTeamId, i.hometeam FROM inserted i
 SET IDENTITY_INSERT tblteamslist off
END

--- Check if away team has already been inserted into the table.
SELECT @awayTeamId = -1
SELECT 
    @awayTeamId = teamId 
FROM 
    [dbo].[tblTeamslist] t
    JOIN inserted i
    ON t.teamName = i.awayteam
IF (@awayTeamId = -1) 
BEGIN
  SET IDENTITY_INSERT tblteamslist ON
    SELECT @awayTeamId = @maxTeamId + 1
    SELECT @maxTeamId = @maxTeamId + 1
    INSERT INTO [dbo].[tblTeamslist]  (teamid,teamname) SELECT @awayTeamId, i.awayteam FROM inserted i
  SET IDENTITY_INSERT tblteamslist off
END

お気付きのように、tblTeamsList に存在しないチームを入力しようとしています。これは、「PRIMARY KEY制約「PK_tblTeamsList」の違反」を取得しているというエラーです。オブジェクト 'dbo.tblTeamsList' に重複するキーを挿入できません。重複キー値は (24).' です。コードでは、ID を毎回 +1 ずつ増やそうとしています。何がうまくいかないのですか?

4

1 に答える 1

1

このエラーが発生するシナリオは 2 つあります。1) 1 つの挿入ステートメントで複数の行を挿入する場合、トリガーは 1 回だけ起動します。その場合、INSERTED (Chris が述べたように) には複数の行が含まれます。tblTeamList への挿入でも、複数の行を挿入しようとするようになりました - すべて同じ teamid です。

2) これらの挿入のうち 2 つが同時に発生した場合、両方が同じ @maxTeamId を読み取る可能性があります。その場合、両者は同じ teamid で tblTeamList にレコードを挿入しようとします。

両方の問題を回避するには、テーブルを回避しようとするのではなく、テーブルで ID 機能を使用します。

于 2012-10-13T17:38:50.030 に答える