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

SQL Serverで主キーを作成する方法(T-SQLの例)

    この記事では、Transact-SQLを使用してテーブルを作成するときにSQLServerで主キーを作成する方法について説明します。

    主キーは、特定のテーブルの一意の識別子として構成されている1つ以上の列です。主キーを使用して、テーブル内のデータの整合性を強化できます。

    テーブルに含めることができる主キーは1つだけであり、主キーはNOT NULLとして定義されている列にのみ追加できます。 。

    この記事では、 newで主キーを作成する方法について説明します。 テーブル(つまり、テーブルを作成するとき)。 既存に主キーを作成する必要がある場合 表については、SQLServerの既存のテーブルに主キーを追加する方法を参照してください。

    例1-主キーを使用してテーブルを作成する

    まず、テストデータベースを作成します:

    CREATE DATABASE PK_Test;
    

    次に、主キー制約を含む新しいテーブルを作成します。

    USE PK_Test;
    
    CREATE TABLE Colors
    (
        ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
        ColorName varchar(50)
    );
    

    これにより、Colorsという新しいテーブルが作成されました ColorIdに主キー制約があります 桁。

    例2–主キーの制約を確認する

    次のコードを実行して、データベース内の主キー制約のリストを返すことができます。

    SELECT
      name,
      type,
      unique_index_id,
      is_system_named
    FROM sys.key_constraints
    WHERE type = 'PK';
    

    結果:

    +------------------------------+--------+-------------------+-------------------+
    | name                         | type   | unique_index_id   | is_system_named   |
    |------------------------------+--------+-------------------+-------------------|
    | PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
    +------------------------------+--------+-------------------+-------------------+
    

    この例では、列を絞り込みました。 sys.key_constraints システムビューはこれより多くの列を返します。いつでも*を使用できます 必要に応じてすべての列を返すワイルドカード。

    クエリ結果から、このデータベースには主キーが1つしかないことがわかります(作成したばかりのキー)。

    この場合、主キーはシステムによって自動的に名前が付けられました。自分の名前を指定することもできます(これについては後で詳しく説明します)。

    例3–インデックスを確認する

    デフォルトでは、主キーを作成するときにクラスター化インデックスが作成されます。クラスタ化インデックスを明示的に指定することも、自動的に作成することもできます。非クラスター化インデックスを指定するオプションもあります。

    上記の主キーを作成したときに自動的に作成されたインデックスを返すクエリは次のとおりです。

    SELECT *
    FROM sys.indexes
    WHERE name = 'PK__Colors__8DA7674DD34F4585';
    

    結果(垂直出力を使用):

    object_id                  | 885578193
    name                       | PK__Colors__8DA7674DD34F4585
    index_id                   | 1
    type                       | 1
    type_desc                  | CLUSTERED
    is_unique                  | 1
    data_space_id              | 1
    ignore_dup_key             | 0
    is_primary_key             | 1
    is_unique_constraint       | 0
    fill_factor                | 0
    is_padded                  | 0
    is_disabled                | 0
    is_hypothetical            | 0
    is_ignored_in_optimization | 0
    allow_row_locks            | 1
    allow_page_locks           | 1
    has_filter                 | 0
    filter_definition          | NULL
    compression_delay          | NULL
    suppress_dup_key_messages  | 0
    auto_created               | 0
    

    この場合、作成した主キーと同じ名前を含む行だけに結果を絞り込みました。 WHEREはいつでも削除できます より多くの結果を返す必要がある場合は、句。

    このインデックスには type_desc があることがわかります CLUSTERED の 。

    例4–主キーの命名

    上で作成した主キーは、システムによって自動的に名前が付けられました。必要に応じて、独自の名前を指定できます。

    主キーの名前を指定する例を次に示します。この場合、非クラスター化インデックスも指定します。

    USE PK_Test;
    
    CREATE TABLE Cats
    (
        CatId int IDENTITY (1,1) NOT NULL, 
           CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId),
        CatName varchar(50)
    );
    

    この場合、オプションのCONSTRAINTを使用します 主キーの定義の開始を示すキーワードと、それに続く主キーの選択した名前。 NONCLUSTEREDも使用しています 非クラスター化インデックスを指定するキーワード。

    主キーを確認してください:

    SELECT
      name,
      type,
      unique_index_id,
      is_system_named
    FROM sys.key_constraints
    WHERE type = 'PK';
    

    結果:

    +------------------------------+--------+-------------------+-------------------+
    | name                         | type   | unique_index_id   | is_system_named   |
    |------------------------------+--------+-------------------+-------------------|
    | PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
    | PK_Cats_CatId                | PK     | 2                 | 0                 |
    +------------------------------+--------+-------------------+-------------------+
    

    インデックスを確認してください:

    SELECT *
    FROM sys.indexes
    WHERE name = 'PK_Cats_CatId';
    

    結果(垂直出力を使用):

    object_id                  | 917578307
    name                       | PK_Cats_CatId
    index_id                   | 2
    type                       | 2
    type_desc                  | NONCLUSTERED
    is_unique                  | 1
    data_space_id              | 1
    ignore_dup_key             | 0
    is_primary_key             | 1
    is_unique_constraint       | 0
    fill_factor                | 0
    is_padded                  | 0
    is_disabled                | 0
    is_hypothetical            | 0
    is_ignored_in_optimization | 0
    allow_row_locks            | 1
    allow_page_locks           | 1
    has_filter                 | 0
    filter_definition          | NULL
    compression_delay          | NULL
    suppress_dup_key_messages  | 0
    auto_created               | 0
    

    したがって、今回は type_desc NONCLUSTERED です 。

    テーブルを作成するときは、CLUSTEREDに注意してください。 1つの制約に対してのみ指定できます。 UNIQUEに指定されている場合 制約とPRIMARY KEY 制約も指定されています。PRIMARY KEY デフォルトはNONCLUSTERED

    例5–Nullable列に主キーを作成する

    主キーは、NOT NULLとして定義されている列に対してのみ作成できます。 。 NULLに設定されている列に主キーを作成しようとした場合 、エラーが発生します。

    ただし、null可能性を指定しない場合、列はNOT NULLに設定されます デフォルトで。

    これを示すために、別のテーブルを作成しましょう。ただし、今回はNULLに設定します。 :

    USE PK_Test;
    
    CREATE TABLE Dogs
    (
        DogId int IDENTITY (1,1) NULL PRIMARY KEY,
        DogName varchar(50)
    );
    

    結果:

    Msg 8147, Level 16, State 1, Line 3
    Could not create IDENTITY attribute on nullable column 'DogId', table 'Dogs'.
    Msg 8111, Level 16, State 1, Line 3
    Cannot define PRIMARY KEY constraint on nullable column in table 'Dogs'.
    Msg 1750, Level 16, State 0, Line 3
    Could not create constraint or index. See previous errors.
    

    予想どおり、エラーが発生します。

    NULLを削除しましょう テーブル定義から再試行してください:

    USE PK_Test;
    
    CREATE TABLE Dogs
    (
        DogId int IDENTITY (1,1) PRIMARY KEY,
        DogName varchar(50)
    );
    

    結果:

    Commands completed successfully.
    Total execution time: 00:00:00.015
    

    今回はテーブルが正常に作成されました。

    それを見てみましょう:

    SELECT 
      t.name AS 'Table',
      c.name AS 'Column', 
      c.is_nullable,
      c.is_identity
    FROM sys.columns c
    INNER JOIN sys.tables T
    ON c.object_id = t.object_id
    WHERE c.name = 'DogId';
    

    結果:

    +---------+----------+---------------+---------------+
    | Table   | Column   | is_nullable   | is_identity   |
    |---------+----------+---------------+---------------|
    | Dogs    | DogId    | 0             | 1             |
    +---------+----------+---------------+---------------+
    

    is_nullable であるため、null許容ではないことがわかります。 フラグは 0 に設定されます 。

    例6–複数の列の主キー

    複数の列に主キーを作成することもできます。複数列の主キーは、複合主キーとも呼ばれます。複合主キーを作成するには、キーを定義するときに列をコンマで区切るだけです。

    このように:

    CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)
    

    複数列の主キーを使用できる状況の例を次に示します。

    CREATE TABLE Musician (
    MusicianId int NOT NULL,
    FirstName varchar(60),
    LastName varchar(60),
    CONSTRAINT PK_Musician PRIMARY KEY (MusicianID)
    );
    
    CREATE TABLE Band (
    BandId int NOT NULL,
    BandName varchar(255),
    CONSTRAINT PK_Band PRIMARY KEY (BandId)
    );
    
    CREATE TABLE BandMember (
    MusicianId int NOT NULL,
    BandId int NOT NULL,
    CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),
    CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId),
    CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId)
    );
    

    この例では、BandMember テーブルには複数列の主キーがあります。この場合、主キーの各列は別のテーブルの主キーへの外部キーでもありますが、これは必須ではありません。

    この例の詳細については、SQLServerで複合主キーを作成する方法を参照してください。

    上記の複合主キーを参照する複数列の外部キーを使用してさらに一歩進んだ例については、SQLServerで複合外部キーを作成する方法も参照してください。


    1. OracleのSIGN()関数

    2. MariaDBの時間値からマイクロ秒を抽出する4つの関数

    3. テーブル値パラメータをJavaからSQLServerストアドプロシージャに渡す方法は?

    4. エラー:参照されたテーブルバーの特定のキーに一致する一意の制約がありません