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

SQL Serverの既存のテーブルに主キーを追加する方法(T-SQLの例)

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

    主キーは、特定のテーブルの一意の識別子として構成された列です。

    通常、テーブルを作成するときに主キー制約を作成しますが、既存のテーブルに主キーを追加することもできます。

    テーブルが持つことができる主キーは1つだけであることに注意してください。したがって、テーブルに主キーがすでにある場合は、主キーを追加できません。

    また、主キーは、NOT NULLとして定義されている列にのみ追加できます。 。

    例1-主キー制約を追加する

    この例ではテーブルを作成していますが、主キー制約を追加するのを忘れています。そこで、戻ってテーブルを変更し、主キーを設定します。

    テーブルを作成します(ただし、主キーの作成を忘れる ):

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

    結果:

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

    おっと–主キーを作成するのを忘れました!

    問題ない!今すぐ追加できます:

    ALTER TABLE Colors
    ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);
    

    結果:

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

    これにより、PRIMARY KEYが追加されました。 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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
    | PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
    | PK_Colors_ColorId            | PK     | 1                 | 0                 |
    +------------------------------+--------+-------------------+-------------------+
    

    データベースの主キーに応じて、結果は異なります。

    また、このシステムビューは、ここで指定した列よりも多くの列を返しますが、*を使用できることにも注意してください。 必要に応じてすべての列を返すワイルドカード。

    例3–NULL値を許可する列に主キーを追加する

    主キーは、NOT NULLとして定義されている列にのみ追加できます 。 null許容の列に主キーを追加しようとすると、エラーが発生します。

    これを示すために、別のテーブルを作成しましょう。ただし、今回は、列をNOT NULLとして指定することも忘れます。 :

    USE Test;
    
    CREATE TABLE Colors2
    (
        ColorId int,
        ColorName varchar(50)
    );
    

    次のクエリを実行して、列でnullが許可されているかどうかを確認できます。

    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 = 'ColorId';
    

    結果:

    +---------+----------+---------------+---------------+
    | Table   | Column   | is_nullable   | is_identity   |
    |---------+----------+---------------+---------------|
    | Colors  | ColorId  | 0             | 1             |
    | Colors2 | ColorId  | 1             | 0             |
    +---------+----------+---------------+---------------+
    

    以前に作成したもの(Colorsで)がわかります table)はnull許容であり、ID列です。 2つ目(Colors2内) table)はnull可能であり、ID列ではありません。

    次に、null許容列に主キー制約を追加してみましょう:

    ALTER TABLE Colors2
    ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
    

    結果:

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

    したがって、この場合、列をNOT NULLに変更する必要があります 主キーとして定義する前に。

    ALTER COLUMNを使用できます ALTER TABLE内 この列をNOT NULLに設定するステートメント :

    ALTER TABLE Colors2
    ALTER COLUMN ColorId int NOT NULL;
    

    もう一度列を確認しましょう:

    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 = 'ColorId';
    

    結果:

    +---------+----------+---------------+---------------+
    | Table   | Column   | is_nullable   | is_identity   |
    |---------+----------+---------------+---------------|
    | Colors  | ColorId  | 0             | 1             |
    | Colors2 | ColorId  | 0             | 0             |
    +---------+----------+---------------+---------------+
    

    つまり、Colors2 0に設定されました 、これはnull許容ではないことを意味します(NULL値を含めることはできません)。

    また、列はではないことに注意してください ID列。これについては後で説明します。

    とにかく、列がNOT NULLとして定義されたので 先に進み、主キーを追加できます:

    ALTER TABLE Colors2
    ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);
    

    結果:

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

    確認するために、このテーブルのすべての主キー制約をもう一度確認しましょう:

    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__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
    | PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
    | PK_Colors_ColorId            | PK     | 1                 | 0                 |
    | PK_Colors2_ColorId           | PK     | 1                 | 0                 |
    +------------------------------+--------+-------------------+-------------------+
    

    PK_Colors2_ColorIdと呼ばれる新しい主キー リストに追加されました。

    例4–列をID列に変更する

    主キーは多くの場合、ID列に適用されます。 ID列は、IDENTITYでそのように定義されます キーワードの後に​​、括弧内にオプションのシードと増分値が続きます。

    新しい行がテーブルに追加されると、SQLServerはID列に一意の増分値を提供します。

    ID列の使用を計画している場合は、すでにそれを実行している必要があります。既存の列をID列に変更することはできません。

    以前にクエリを実行したとき、Colors2.ColorIdであることがわかりました。 列はではありません ID列(is_identityであるため、これはわかります 0に設定されています )。これは、PK_Colors2_ColorIdを作成したことを意味します 非ID列の主キー。

    テーブルをID列に変更しようとすると、次のようになります。

    ALTER TABLE Colors2
    ALTER COLUMN 
      ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;
    

    結果:

    Msg 156, Level 15, State 1, Line 3
    Incorrect syntax near the keyword 'IDENTITY'.
    

    前述のように、これを克服するには、列を削除してやり直す必要があります。

    列にすでにデータが含まれている場合は、追加の作業を行う必要があります。これはこの記事の範囲外ですが、上記の列を削除してID列として再作成する例を次に示します。

    USE Test; 
    
    DROP TABLE Colors2;
    
    CREATE TABLE Colors2
    (
        ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
        ColorName varchar(50)
    );
    

    結果:

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

    今回は主キー制約の名前を指定しなかったことに注意してください。この場合、システムはその名前を作成します。

    列をすばやく確認します:

    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 = 'ColorId';
    

    結果:

    +---------+----------+---------------+---------------+
    | Table   | Column   | is_nullable   | is_identity   |
    |---------+----------+---------------+---------------|
    | Colors  | ColorId  | 0             | 1             |
    | Colors2 | ColorId  | 0             | 1             |
    +---------+----------+---------------+---------------+
    

    はい、ID列になりました。

    このテーブルの主キーをもう一度見てみましょう:

    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__MyTest__606C418F16F9CCCF  | PK     | 1                 | 1                 |
    | PK__Client__96ADCE1ACB91C2A9  | PK     | 1                 | 1                 |
    | PK_Colors_ColorId             | PK     | 1                 | 0                 |
    | PK__Colors2__8DA7674D8F57294D | PK     | 1                 | 1                 |
    +-------------------------------+--------+-------------------+-------------------+
    

    これで、PK__Colors2__8DA7674D8F57294Dというシステム名の主キーができました。 。


    1. MySQLで複数の列を更新する方法

    2. PostgreSQLで特定の列名を持つ列を選択します

    3. 最高のPostgreSQL高可用性フレームワークは何ですか? PAF vs. repmgrvs.Patroniインフォグラフィック

    4. 統計を待つだけでは不十分な理由