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

SQL Serverの「rowversion」とは何ですか?

    SQL Serverでは、 rowversion データベース内で自動的に生成された一意の2進数を公開するデータ型です。これにより、テーブルの行に一意の値をバージョンスタンプできます。これは、複数のユーザーが同時に行を更新しているときにデータベースの整合性を維持するのに役立ちます。

    各SQLServerデータベースには、行バージョンの列を含むテーブルで実行される挿入または更新操作ごとにインクリメントされるカウンターがあります。 データ型(またはそのタイムスタンプ 同義語。非推奨のフラグが立てられています。

    テーブルに行バージョンが含まれている場合 (またはタイムスタンプ )列、行が挿入または更新されるたびに、行バージョンの値 columnは現在のrowversion値に設定されます。これは、UPDATEの場合でも当てはまります。 ステートメントによってデータが変更されることはありません。

    例1–行バージョン列を持つテーブルを作成する

    行バージョンを使用してテーブルを作成する例を次に示します。 桁。

    CREATE DATABASE Test_rowversion;
    USE Test_rowversion;
    CREATE TABLE Pet (
        PetId int IDENTITY(1,1) PRIMARY KEY, 
        PetName varchar(255),
        VersionStamp rowversion
        );
    
    SELECT @@DBTS AS Before;
    
    INSERT INTO Pet (PetName)
    VALUES ('Max');
    
    SELECT @@DBTS AS After;
    

    結果:

    Commands completed successfully.
    Changed database context to 'Test_rowversion'.
    Commands completed successfully.
    +--------------------+
    | Before             |
    |--------------------|
    | 0x00000000000007D0 |
    +--------------------+
    (1 row affected)
    (1 row affected)
    +--------------------+
    | After              |
    |--------------------|
    | 0x00000000000007D1 |
    +--------------------+
    (1 row affected)
    

    結果の「前」と「後」の値を見てください。これは、現在の行バージョンを表します 値。

    この場合、新しいデータベースとテーブル、および rowversionを作成しました。 値は0x00000000000007D0で始まります 。行を挿入したら、行バージョン 0x00000000000007D1にインクリメントされました 。

    例2–更新

    前述のように、行バージョン 更新を行うと、値も増分されます。

    例:

    SELECT * FROM Pet;
    
    UPDATE Pet
    SET PetName = 'Maxine'
    WHERE PetId = 1;
    
    SELECT * FROM Pet;
    

    結果:

    +---------+-----------+--------------------+
    | PetId   | PetName   | VersionStamp       |
    |---------+-----------+--------------------|
    | 1       | Max       | 0x00000000000007D1 |
    +---------+-----------+--------------------+
    (1 row affected)
    (1 row affected)
    +---------+-----------+--------------------+
    | PetId   | PetName   | VersionStamp       |
    |---------+-----------+--------------------|
    | 1       | Maxine    | 0x00000000000007D2 |
    +---------+-----------+--------------------+
    (1 row affected)
    

    ここでは、PetNameを更新します 列、およびVersionStamp 列(行バージョン )は0x00000000000007D2にインクリメントされます 。

    例3–変更なしの更新

    行バージョンの優れた点の1つ すべてのUPDATEでインクリメントされるということです 操作変更が行われない場合でも

    たとえば、前のコードを再度実行すると、VersionStampの値が 変更が行われていなくても、列は変更されます:

    SELECT * FROM Pet;
    
    UPDATE Pet
    SET PetName = 'Maxine'
    WHERE PetId = 1;
    
    SELECT * FROM Pet;
    

    結果:

    +---------+-----------+--------------------+
    | PetId   | PetName   | VersionStamp       |
    |---------+-----------+--------------------|
    | 1       | Maxine    | 0x00000000000007D2 |
    +---------+-----------+--------------------+
    (1 row affected)
    (1 row affected)
    +---------+-----------+--------------------+
    | PetId   | PetName   | VersionStamp       |
    |---------+-----------+--------------------|
    | 1       | Maxine    | 0x00000000000007D3 |
    +---------+-----------+--------------------+
    (1 row affected)
    

    PetIdの値 およびPetName 列は変更されませんでしたが、VersionStamp 列がインクリメントされました。

    例4–タイムスタンプデータ型

    タイムスタンプ データ型は行バージョンの同義語です 。ただし、タイムスタンプ は、SQLServerの将来のバージョンで非推奨のフラグが立てられたデータ型の1つです。当然のことながら、Microsoftは、新しい開発作業でこの機能を使用することを避け、現在この機能を使用しているアプリケーションを変更することを計画することをお勧めします。

    したがって、タイムスタンプを使用するデータベースに遭遇した場合 データ型の場合は、行バージョンに変更することを検討してください。 。

    デモンストレーションの目的で、タイムスタンプを使用する最初の例を変更します。 行バージョンの代わりに :

    CREATE DATABASE Test_timestamp;
    USE Test_timestamp;
    CREATE TABLE Pet (
        PetId int IDENTITY(1,1) PRIMARY KEY, 
        PetName varchar(255),
        timestamp
        );
    
    SELECT @@DBTS AS Before;
    
    INSERT INTO Pet (PetName)
    VALUES ('Max');
    
    SELECT @@DBTS AS After;
    

    結果:

    Commands completed successfully.
    Changed database context to 'Test_timestamp'.
    Commands completed successfully.
    +--------------------+
    | Before             |
    |--------------------|
    | 0x00000000000007D0 |
    +--------------------+
    (1 row affected)
    (1 row affected)
    +--------------------+
    | After              |
    |--------------------|
    | 0x00000000000007D1 |
    +--------------------+
    (1 row affected)
    

    その間、タイムスタンプ用に変更された次の例を次に示します。 :

    SELECT * FROM Pet;
    
    UPDATE Pet
    SET PetName = 'Maxine'
    WHERE PetId = 1;
    
    SELECT * FROM Pet;
    

    結果:

    +---------+-----------+--------------------+
    | PetId   | PetName   | timestamp          |
    |---------+-----------+--------------------|
    | 1       | Max       | 0x00000000000007D1 |
    +---------+-----------+--------------------+
    (1 row affected)
    (1 row affected)
    +---------+-----------+--------------------+
    | PetId   | PetName   | timestamp          |
    |---------+-----------+--------------------|
    | 1       | Maxine    | 0x00000000000007D2 |
    +---------+-----------+--------------------+
    (1 row affected)
    

    タイムスタンプの名前を実際に提供しなかったことにお気づきかもしれません。 桁。列名を指定しない場合、SQLServerデータベースエンジンはタイムスタンプを生成します 列名。

    ただし、行バージョン この構文は許可されていないため、 rowversionを使用する場合は列名を指定する必要があります 。


    1. SQLでのテーブルのピボット(クロス集計/クロス集計)

    2. Wordpressの致命的なエラー:キャッチされないエラー:/wp-includes/wp-db.php:1570の未定義の関数mysql_connect()の呼び出し

    3. SQL ServerのSELECTから更新するにはどうすればよいですか?

    4. CakePHPの1つのモデルに複数のデータベースを動的に使用する方法