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

SQLServerIdentityの概要

    この記事では、SQLServerIDENTITYプロパティとIDENTITY列の機能の基本と詳細について説明します。また、IDENTITY_INSERT機能を使用してID列に明示的な値を挿入する方法についても検討します。

    SQLServerのIDENTITYプロパティとIDENTITY列の概要

    SQL Serverでは、identityプロパティを使用すると、identityプロパティ構文の設定に従ってSQLServerテーブルにID列を作成できます。 Identityプロパティの構文は次のようになり、この構文を適用してテーブルステートメントを作成または変更します。

    IDENTITY [(シード、増分)]

    最初に、identityプロパティのパラメータを調べます。このプロパティは2つの入力パラメータを取ります。最初のパラメータはシードで、2番目のパラメータは増分です。 seedパラメーターは、テーブルに挿入された値の最初の開始値を指定し、Incrementパラメーターは、挿入されたデータの増分値を定義します。

    ここで、いくつかの例を使用して、IDプロパティのこの主要な定義を強化します。

    SQLServerでID列を作成する方法

    例-1 :次の例では、ID列を作成し、最初の値は1から始まり、1ずつ増加します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    GO
    
    INSERT INTO TestIdentity
    VALUES ('The first inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The second inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The third inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The fourth inserted row')
    
    SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

    例-2 :次の例では、ID列を作成し、最初の値は37から始まり、20ずつ20ずつ増加します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(37,20) ,
    Col1 VARCHAR(100))
    
    GO
    
    INSERT INTO TestIdentity
    VALUES ('The first inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The second inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The third inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The fourth inserted row')
    
    SELECT Id as [IdentityColumn],Col1 FROM TestIdentity

    上記の例でわかるように、identityプロパティは、シードとIDのパラメーターに従って自動インクリメント値を生成します。

    SQL Server ID列に明示的な値を挿入するにはどうすればよいですか?

    デフォルトでは、identityプロパティでは、ID列に明示的な値を挿入することはできません。 ID列に明示的な値を挿入しようとすると、次のエラーが発生します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    GO
    
    INSERT INTO TestIdentity
    VALUES (1,'The first inserted row')

    メッセージ8101、レベル16、状態1、行9
    のID列の明示的な値 table 、「TestIdentity」は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。

    テーブルのIDENTITY_INSERT機能を有効にすることで、このエラーを解決できます。ここで、挿入ステートメントを次のように変更します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    SET IDENTITY_INSERT TestIdentity ON
    
    INSERT INTO TestIdentity (Id,Col1)  
    VALUES (1,'The first inserted row')
    
    SET IDENTITY_INSERT TestIdentity OFF
    
    SELECT * FROM TestIdentity

    この問題に関するもう1つの重要な点は、ステートメントを挿入するための列リストを作成する必要があることです。これを行わないと、次のエラーが発生します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    SET IDENTITY_INSERT TestIdentity ON
    
    INSERT INTO TestIdentity   
    VALUES (1,'The first inserted row')
    
    SET IDENTITY_INSERT TestIdentity OFF
    >

    メッセージ8101、レベル16、状態1、行9
    のID列の明示的な値 table 、「TestIdentity」は、列リストが使用され、IDENTITY_INSERTがONの場合にのみ指定できます。

    このエラーは、挿入ステートメントに列リストがないことを定義します。以下の挿入ステートメントで、このエラーを修正します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    SET IDENTITY_INSERT TestIdentity ON
    
    INSERT INTO TestIdentity  (Id,Col1) ---column list
    VALUES (90,'The first inserted row')
    
    SET IDENTITY_INSERT TestIdentity OFF

    場合によっては、別のテーブルから1つのテーブルにデータを挿入する必要があります。この操作を実行する最良の方法の1つは、「INSERTINTOSELECT」ステートメントを使用することです。ただし、ターゲットテーブルにID列がある場合は、ターゲットテーブルでIDENTITY_INSERTオプションを有効にする必要があります。また、ターゲットテーブルの列リストを作成する必要があります。

    DROP TABLE IF EXISTS TestIdentity
    DROP TABLE IF EXISTS SourceTable 
    CREATE TABLE SourceTable (ID INT,
    Val1 VARCHAR(100))
    INSERT INTO SourceTable 
    VALUES (1,'First Row'),(2,'Second Row')
    GO
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    SET IDENTITY_INSERT TestIdentity ON
    INSERT INTO TestIdentity  (Id,Col1) 
    SELECT * FROM SourceTable
    SET IDENTITY_INSERT TestIdentity OFF

    IDENTITY_INSERTオプションの欠点は、ID列の値の間にギャップが生じる可能性があることです。次のようなステートメントは、ID列の値の間にギャップを生成します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    INSERT INTO TestIdentity  ---column list
    VALUES ('The first inserted row (INDENTITY_INSERT_OFF)')
    
    SET IDENTITY_INSERT TestIdentity ON
    
    INSERT INTO TestIdentity  (Id,Col1) ---column list
    VALUES (90,'The second inserted row (INDENTITY_INSERT_ON')
    
    SET IDENTITY_INSERT TestIdentity OFF
    
    
    INSERT INTO TestIdentity   ---column list
    VALUES ('The third inserted row (INDENTITY_INSERT_OFF)')
    
    
    SELECT * FROM TestIdentity

    DBCCCHECKIDENTコマンド

    DBCC CHECKIDENTコマンドを使用すると、ID列の最後の値に関する詳細を取得できます。この関数を使用すると、ID列の現在の値をリセットして別の値に変更することもできます。ここで、DBCCCHECKIDENTコマンドを使用してIDの最後の値を取得します。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    
    GO
    
    INSERT INTO TestIdentity
    VALUES ('The first inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The second inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The third inserted row')
    
    INSERT INTO TestIdentity
    VALUES ('The fourth inserted row')
    
    DBCC CHECKIDENT ('TestIdentity', NORESEED)

    DBCC CHECKIDENTコマンドに関する別のオプションは、ID列を必要な値にリセットすることです。次の例では、RESEEDパラメーターがID列の最大値を100に変更し、その後に挿入される値はこの最大値を使用します。

    DROP TABLE IF EXISTS TestIdentity
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    GO
    INSERT INTO TestIdentity
    VALUES ('The first inserted row')
    INSERT INTO TestIdentity
    VALUES ('The second inserted row')
    INSERT INTO TestIdentity
    VALUES ('The third inserted row')
    INSERT INTO TestIdentity
    VALUES ('The fourth inserted row')
    GO
    DBCC CHECKIDENT ('TestIdentity',RESEED,100)
    GO
    INSERT INTO TestIdentity
    VALUES ('The fifth inserted row')
    
    SELECT  * FROM TestIdentity

    SQLServerのID列と一意性

    ID列は、一意の値の生成を保証するものではありません。これはID列に関する一般的な紛らわしい問題であるため、生成された値の一意性を確保したい場合は、これらの列に一意のインデックスを使用できます。次に、ID列に重複する値を作成する方法を証明およびデモンストレーションします。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) ,
    Col1 VARCHAR(100))
    SET IDENTITY_INSERT TestIdentity ON
    INSERT INTO TestIdentity  (Id,Col1)
    VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
    
    INSERT INTO TestIdentity  (Id,Col1)
    VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
    
    
    SET IDENTITY_INSERT TestIdentity OFF
    
    
    SELECT  * FROM TestIdentity

    さらに、ID列と主キーはSQLServerの2つの異なるオブジェクトです。 ID列の使用目的は、自動インクリメントされた番号を生成することです。一方、主キー制約は、特定の列の値の一意性を保証および提供します。デフォルトでは、主キーはテーブルにクラスター化された一意のインデックスを作成するため、主キー制約は定義された列に一意の値を適用します。一般的な使用法では、主キー制約とIDプロパティを一緒に使用できます。この使用方法は、主キーの一意性とIDの自動インクリメント機能の柔軟性を適用された列にもたらすのに役立ちます。次の例では、Id列に主キー制約を追加し、挿入された値の重複を防ぎます。

    DROP TABLE IF EXISTS TestIdentity
    
    CREATE TABLE TestIdentity
    (Id INT IDENTITY(1,1) PRIMARY KEY,
    Col1 VARCHAR(100))
    SET IDENTITY_INSERT TestIdentity ON
    INSERT INTO TestIdentity  (Id,Col1)
    VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
    
    INSERT INTO TestIdentity  (Id,Col1)
    VALUES (1,'The first inserted row (INDENTITY_INSERT_OFF)')
    SET IDENTITY_INSERT TestIdentity OFF
    
    
    SELECT  * FROM TestIdentity

    オブジェクトエクスプローラーでTestIdentityテーブルの[インデックス]タブをナビゲートすると、主キー制約によって作成された一意のクラスター化インデックスを見つけることができます。この制約は、Id列の一意の値に適用されます。

    結論

    この記事では、SQLServerIdentityプロパティとIdentity列の基本的な概念と使用方法について説明しました。

    参照

    • CREATE TABLE(Transact-SQL)IDENTITY(プロパティ)
    • 主キーを作成する

    1. 一貫してMicrosoftAccessMVPアワードを獲得する方法

    2. pg_viewsのクエリからの不完全な情報

    3. PostgreSQLの単一引用符と二重引用符の違いは何ですか?

    4. C#アプリケーションでSQL Serverデータベースのすべてのテーブルの名前を取得できますか?