sql >> データベース >  >> RDS >> Sqlserver

カスタムの自動インクリメント列を維持する

    問題は、複数の行が挿入されている場合、すべての行に同じ次の利用可能な ID を使用している場合、ROW_NUMBER() を追加する必要があることです。 xid が挿入内で一意であることを確認します:

    insert into [xtable] (XID)
    select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
    from inserted [i]
    cross apply
    (
      select coalesce(max([t].[XID]), 0) [NextavailableID]
      from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
    ) [x];
    

    重複の防止に関しては、テーブル ヒントを使用して xtable をロックできます。 最大の xid を取得するとき .

    これらのロックを使用することの欠点は、デッドロックが発生することです。この列には一意の制約/インデックスが必要です。これにより重複が防止されますが、競合条件が満たされた場合にも例外が発生します。最終的には、どの方法を選択するにしても、何らかの犠牲を払う必要があります。



    1. 同じテーブルフィールドでのSailsjsMysqlORM複数クエリ

    2. 複数列のMySQLSelectステートメントDISTINCT

    3. FLASHas3がlocalhostphpWebアドレスを識別できません

    4. PDOException:SQLSTATE [HY000] [2002] php_network_getaddresses:getaddrinfoが失敗しました:名前またはサービスが不明です