4
INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
   SELECT 
      COLUMN1,
      (SELECT COALESCE(MAX(PRIMARY_KEY), 0) 
        FROM TABLE1) + 1 
   FROM 
      TABLE2

エラー:

主キー制約の違反。重複するキーをオブジェクトに挿入できません。

最初の行の後に主キーをインクリメントするにはどうすればよいですか?

RBARを挿入するのではなく、同時にこのテーブルにアイテムのリストを追加できるようにしたいと思います。

助けてくれてありがとう

4

3 に答える 3

12
INSERT INTO TABLE1 (COLUMN1, PRIMARY_KEY)
SELECT COLUMN1,
       (SELECT COALESCE(MAX(PRIMARY_KEY),0)
       FROM TABLE1) + row_number() over (order by 1/0)
FROM TABLE 2

このステートメントだけの場合、IDはシーケンシャルになります。たとえば、Max(Primary Key)が99で、4つのレコードを挿入する場合、100、101、102、103になります。複数のプロセスが同時に挿入されると、制約違反が発生しやすくなりますが、とにかく、MAX()本質的に安全ではない単一のレコードで持っているものよりも悪いと言っているわけではありません。

于 2012-12-12T18:51:18.547 に答える
2

あなたはこれを試すことができます:

DECLARE @CurrentPK INT
SELECT @CurrentPK(MAX(PRIMARY_KEY)

SELECT column1, ROW_NUMBER() OVER (ORDER BY column1) AS 'RowNumber'
INTO #temp
FROM Table2

INSERT INTO TABLE1
(COLUMN1, PRIMARY_KEY)
SELECT COLUMN1,@CurrentPK+RowNumber 
FROM #temp

もちろん、競合状態を防ぐために、これをトランザクションに入れて、同時に発生する他の挿入を明示的にロックアウトする必要があります。最善の策は、try6catchブロックとトランザクション処理を備えたストアドプロシージャです。

この場合、取引を回避することはできませんので、ご了承ください。特にトランザクションを使用しない場合、2つのtprocessが同じID番号を使用しようとすることがあります。実際、最後のID番号を取得する方法は、それを使用してデータベースの問題を作成するのが非常に簡単であるため、推奨されないのはそのためです。私はあなたがこれに固執していることを知っていますが、少なくとも将来この種の近視眼的なアンチパターンを決して使用しないことを学びます。

于 2012-12-12T18:54:35.153 に答える
-1

最大キーをチェックして1ずつ1ずつ増やす必要はありません。IDENTITY(1,1) NOT NULL列にすると、サーバーがそれを処理します。次に、を使用します。

INSERT INTO TABLE1 (COLUMN1)
SELECT COLUMN1
FROM TABLE 2
于 2012-12-12T18:05:46.113 に答える