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

SQL Serverのテーブルで最適な一意の識別子を見つける方法:sp_special_columns

    SQL Serverでは、sp_special_columnsを使用できます テーブルの一意の識別子を識別するためのシステムストアドプロシージャ。具体的には、テーブル内の行を一意に識別する最適な列のセットを返します。また、行の値がトランザクションによって更新されたときに自動的に更新された列を返します。

    sp_special_columns ODBCのSQLSpecialColumnsと同等です。

    テーブルを一意に識別できる列がない場合、結果セットは空です。

    構文

    構文は次のようになります:

    sp_special_columns [ @table_name = ] 'table_name'     
         [ , [ @table_owner = ] 'table_owner' ]   
         [ , [ @qualifier = ] 'qualifier' ]   
         [ , [ @col_type = ] 'col_type' ]   
         [ , [ @scope = ] 'scope' ]  
         [ , [ @nullable = ] 'nullable' ]   
         [ , [ @ODBCVer = ] 'ODBCVer' ]   
    [ ; ]
    

    @table_name 引数が必要です。その他はオプションです。各引数の詳細な説明については、Microsoftのドキュメントを参照してください。

    例1-主キー列

    これは、 PersonId という主キー列を持つテーブルに対する基本的な例です。 :

    EXEC sp_special_columns Person;
    

    次のように実行することもできます:

    EXEC sp_special_columns @table_name = 'Person';
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    この場合、主キー列が返されます。次のコードでテーブルを作成したので、これが主キー列であることがわかります。

    CREATE TABLE Person (
      PersonId int primary key, 
      PersonName varchar(500)
      );
    

    したがって、ストアドプロシージャは、実際には、このテーブルを一意に識別する最適な列を返したようです。

    例2–UNIQUE列

    この例のテーブルには主キーはありませんが、UNIQUEはあります。 制約。

    テーブルの作成に使用されるコードは次のとおりです。

    CREATE TABLE Event (
      EventId int UNIQUE, 
      EventName varchar(500)
      );
    

    それでは、sp_special_columnsを実行してみましょう。 そのテーブルに対して:

    EXEC sp_special_columns Event;
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    この場合、UNIQUEの列 制約は最適な一意の識別子と見なされます。

    ただし、これは必ずしもを意味するわけではありません UNIQUEによって制約された列 制約は自動的に一意の識別子として認定されます。結果は、null値の処理方法によって異なります。

    例3–@nullable引数

    @nullableを使用できます 特殊列がNULL値を受け入れることができるかどうかを指定する引数。

    ここでは、同じコードを再度実行しますが、今回は@nullable = 'O'を使用します。 。

    EXEC sp_special_columns 
      Event, 
      @nullable = 'O';
    

    結果:

    (0 rows affected)
    

    ここでは、@nullable = 'U'を使用しています。

    EXEC sp_special_columns 
      Event, 
      @nullable = 'U';
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    O null値を許可しない特別な列を指定します。 U 部分的にNULL可能である列を指定します。 U デフォルト値です。

    列をNOT NULLとして作成するとどうなりますか。 :

    DROP TABLE Event;
    
    CREATE TABLE Event (
      EventId int NOT NULL UNIQUE, 
      EventName varchar(500)
      );
    
    EXEC sp_special_columns 
      Event, 
      @nullable = 'U';
    
    EXEC sp_special_columns 
      Event, 
      @nullable = 'O';
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    (1 row affected)
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    (1 row affected)
    

    今回は両方のO およびU 同じ結果が得られました。

    複数のUNIQUEを持つテーブルがある場合 制約列、およびnull値を許可するものと許可しないものがありますが、この引数は、最適な一意の識別子と見なされるものに影響を与える可能性があります。私が言っていることの例については、この記事の下部にある例7を参照してください。

    例4–IDENTITY列

    この例のテーブルには、主キーまたはUNIQUEがありません 制約がありますが、IDENTITYがあります 列。

    テーブルの作成に使用されるコードは次のとおりです。

    CREATE TABLE Product (
      ProductId int IDENTITY, 
      ProductName varchar(500)
      );
    

    それでは、sp_special_columnsを実行してみましょう。 そのテーブルに対して:

    EXEC sp_special_columns Product;
    

    結果:

    (0 rows affected)
    

    つまり、IDENTITYのようです このテーブルを一意に識別するには十分ではありません。

    例5–複数列の主キー

    これは、複数列の主キーを持つものです。この場合、主キーには2つの列が使用されます。

    テーブルの作成に使用されるコードは次のとおりです。

    CREATE TABLE PersonProduct (
      PersonId int, 
      ProductId int,
       CONSTRAINT PK_PersonProduct PRIMARY KEY (PersonId, ProductId)
      ); 
    

    それでは、sp_special_columnsを実行してみましょう。 そのテーブルに対して:

    EXEC sp_special_columns PersonProduct;
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
    | 1       | ProductId     | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    例6–主キーと一意性制約

    主キーがおよびある場合はどうなりますか UNIQUE 同じテーブルに制約がありますか?

    調べてみましょう:

    CREATE TABLE PersonEvent (
      PersonEventId int UNIQUE,
      PersonId int, 
      EventId int,
       CONSTRAINT PK_PersonEvent PRIMARY KEY (PersonId, EventId)
      );
    

    sp_special_columnsを実行します そのテーブルに対して:

    EXEC sp_special_columns PersonEvent;
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | PersonId      | 4           | int         | 10          | 4        | 0       | 1               |
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    主キーが勝ちました。

    主キーとUNIQUEを切り替えるとどうなりますか 周りの重要な列?

    OK、そのためだけに別のテーブル全体を作成しましょう:

    CREATE TABLE PersonEvent2 (
      PersonEventId int PRIMARY KEY,
      PersonId int UNIQUE, 
      EventId int UNIQUE
      ); 
    

    sp_special_columnsを実行します そのテーブルに対して:

    EXEC sp_special_columns PersonEvent2;
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | PersonEventId | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    そのため、主キーが再び勝ちました。

    例7–多くの一意の制約

    すべての場合はどうなりますか 列にUNIQUEがあります 制約?

    CREATE TABLE Event2 (
      EventId int UNIQUE, 
      EventName varchar(500) UNIQUE,
      StartDate date UNIQUE,
      EndDate date UNIQUE
      );
    

    sp_special_columnsを実行します そのテーブルに対して:

    EXEC sp_special_columns Event2;
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EndDate       | -9          | date        | 10          | 20       | NULL    | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    しかし、これらの列の1つをNOT NULLに設定するとどうなるか見てみましょう。 、次に@nullable = 'O'を使用します :

    DROP TABLE Event2;
    
    CREATE TABLE Event2 (
      EventId int NOT NULL UNIQUE, 
      EventName varchar(500) UNIQUE,
      StartDate date UNIQUE,
      EndDate date UNIQUE
      );
    

    sp_special_columnsを実行します @nullable = 'O'を使用 :

    EXEC sp_special_columns 
      Event2,
      @nullable = 'O'; 
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EventId       | 4           | int         | 10          | 4        | 0       | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    そのため、「null許容ではない」列が最適な一意の識別子として選択されるようになりました。

    それでは、sp_special_columnsを実行してみましょう。 @nullable = 'U'を使用 :

    EXEC sp_special_columns 
      Event2,
      @nullable = 'U';
    

    結果:

    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    | SCOPE   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | PSEUDO_COLUMN   |
    |---------+---------------+-------------+-------------+-------------+----------+---------+-----------------|
    | 1       | EndDate       | -9          | date        | 10          | 20       | NULL    | 1               |
    +---------+---------------+-------------+-------------+-------------+----------+---------+-----------------+
    

    前の列に戻ります。


    1. Oracle PL / SQL開発者で日付付きの時間部分を表示するための設定は何ですか?

    2. Hibernate、id、oracle、sequence

    3. SQL ServerでのDATENAME()の例

    4. OracleのJSON_ARRAYAGG()関数