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

単純な SQL INSERT だけで手動インクリメントを実装できますか?

    衝突することを理解していますよね?

    このようなことを行う必要があり、デッドロックが発生する可能性があるため、ここで何を達成しようとしているのかをよく確認してください

    DECLARE @id int
    BEGIN TRAN
    
        SELECT @id = MAX(id) + 1 FROM Table1 WITH (UPDLOCK, HOLDLOCK)
        INSERT INTO Table1(id, data_field)
        VALUES (@id ,'[blob of data]')
    COMMIT TRAN
    

    衝突を説明するために、いくつかのコードを提供しました

    最初にこのテーブルを作成し、1 行挿入します

    CREATE TABLE Table1(id int primary key not null, data_field char(100))
    GO
    Insert Table1 values(1,'[blob of data]')
    Go
    

    2 つのクエリ ウィンドウを開き、これを同時に実行します

    declare @i int
    set @i =1
    while @i < 10000
    begin
    BEGIN TRAN
    
    INSERT INTO Table1(id, data_field)
    SELECT MAX(id) + 1, '[blob of data]' FROM Table1
    
    COMMIT TRAN;
    set @i [email protected] + 1
    end
    

    これらがたくさん表示されます

    サーバー:メッセージ 2627、レベル 14、状態 1、行 7 PRIMARY KEY 制約 'PK__Table1__3213E83F2962141D' の違反。オブジェクト 'dbo.Table1' に重複するキーを挿入できません。ステートメントは終了しました。



    1. Mysql再帰ストアドプロシージャ...制限0に達しました...max_sp_recursion_depth変数を変更できません

    2. RDSで、マスターに存在しないリードレプリカにテーブルを作成できますか?

    3. MySQLカスタムオーダー

    4. タイムスタンプとは?