多くの場合、SQL Serverで同じ(または同様の)ことを行う方法はたくさんあります。データベースからすべての主キー(または特定のテーブルの主キーだけ)を取得するのが適切な例です。
この記事では、SQLServerで主キー情報を取得するための11の異なるアプローチを紹介します。
正確な状況によっては、これらのいくつかは他のものよりも便利です。
例1-sp_pkeysシステムストアドプロシージャ
特定のテーブルの主キーが必要な場合は、sp_pkeys
システムストアドプロシージャは、おそらくそれを行うための最も速くて簡単な方法です。これを行うには、テーブル名をプロシージャに渡すだけです。
このように:
EXEC sp_pkeys Artists;
結果(垂直出力を使用):
TABLE_QUALIFIER | Music TABLE_OWNER | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId KEY_SEQ | 1 PK_NAME | PK__Artists__25706B50FCD918B1
この場合、 Artists に主キーをリクエストしました テーブル。主キー名( PK__Artists__25706B50FCD918B1 )を返します。 )、データベース名( Music )、テーブル名、列名( ArtistId )、およびその他の情報。
または、すべての引数を明示的に指定して同じ結果を得ることができます。
EXEC sp_pkeys @table_name = Artists, @table_owner = dbo, @table_qualifier = Music;
例2–KEY_COLUMN_USAGEシステムビュー
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
システムビューは、現在のデータベースでキーとして制約されている列ごとに1行を返します。したがって、このビューで外部キーも返されます。
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;
結果:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Albums | GenreId | FK_Albums_Genres | | Albums | AlbumId | PK__Albums__97B4BE379FC780BD | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | | Genres | GenreId | PK__Genres__0385057E88BB96F8 | +--------------+---------------+-------------------------------+
これにより、すべてのテーブルから制約が返されることがわかります。 WHERE
を追加することもできます 結果を特定のテーブルに絞り込む句。
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
結果:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | +--------------+---------------+-------------------------------+
これらの例では、関心のあるビューの列だけに結果を絞り込みましたが、アスタリスク(*
)を使用することもできます。 )すべての列を返すワイルドカード。
SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
結果(垂直出力を使用):
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId ORDINAL_POSITION | 1
例3–CONSTRAINT_COLUMN_USAGEシステムビュー
これは前の例と似ています。 INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
システムビューは、列に制約が定義されている現在のデータベースの列ごとに1行を返します。 INFORMATION_SCHEMA.KEY_COLUMN_USAGE
と同様 このビューで外部キーも返されます。ただし、INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE
キーの制約だけに限定されません。
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE;
結果:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Albums | GenreId | FK_Albums_Genres | | Albums | AlbumId | PK__Albums__97B4BE379FC780BD | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | | Genres | GenreId | PK__Genres__0385057E88BB96F8 | +--------------+---------------+-------------------------------+
WHERE
を使用できます 特定のテーブルまたは列のみを返す句:
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE COLUMN_NAME = 'ArtistId';
結果:
+--------------+---------------+-------------------------------+ | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | |--------------+---------------+-------------------------------| | Albums | ArtistId | FK_Albums_Artists | | Artists | ArtistId | PK__Artists__25706B50FCD918B1 | +--------------+---------------+-------------------------------+
この場合、列名を指定したので、その名前の列に対するすべての制約が返されました。実は、データベースは2つの異なるテーブルで同じ列名を使用しています。 1つには外部キー制約があり、もう1つには主キーがあります。したがって、両方の行が返されます。
ここでも、アスタリスク(*
)を使用できます )すべての列を返すワイルドカード。
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE WHERE TABLE_NAME = 'Artists';
結果(垂直出力を使用):
TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists COLUMN_NAME | ArtistId CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1
この例では、出力を特定のテーブルの制約のみに制限しました。
例4–CONSTRAINT_TABLE_USAGEシステムビュー
INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE
システムビューは、テーブルに制約が定義されている現在のデータベースのテーブルごとに1行を返します。
SELECT TABLE_NAME, CONSTRAINT_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE;
結果:
+--------------+-------------------------------+ | TABLE_NAME | CONSTRAINT_NAME | |--------------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | | Albums | FK_Albums_Artists | | Albums | FK_Albums_Genres | +--------------+-------------------------------+
このビューは、制約が使用されている列名を返さないため、要件によってはあまり役に立たない場合があります。
これは、 ジャンル のこのビューによって返されるすべてのデータを示す例です。 テーブル:
SELECT * FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE WHERE TABLE_NAME = 'Genres';
結果:
TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Genres CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Genres__0385057E88BB96F8
例5–TABLE_CONSTRAINTSシステムビュー
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
システムビューは、現在のデータベースのテーブル制約ごとに1行を返します。
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
結果:
+--------------+-------------------------------+-------------------+ | TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE | |--------------+-------------------------------+-------------------| | Artists | PK__Artists__25706B50FCD918B1 | PRIMARY KEY | | Genres | PK__Genres__0385057E88BB96F8 | PRIMARY KEY | | Albums | PK__Albums__97B4BE379FC780BD | PRIMARY KEY | | Albums | FK_Albums_Artists | FOREIGN KEY | | Albums | FK_Albums_Genres | FOREIGN KEY | +--------------+-------------------------------+-------------------+
このビューは列名を提供しませんが、制約タイプを提供します。したがって、結果を主キーのみに絞り込むことができます。
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'PRIMARY KEY';
結果:
+--------------+-------------------------------+-------------------+ | TABLE_NAME | CONSTRAINT_NAME | CONSTRAINT_TYPE | |--------------+-------------------------------+-------------------| | Artists | PK__Artists__25706B50FCD918B1 | PRIMARY KEY | | Genres | PK__Genres__0385057E88BB96F8 | PRIMARY KEY | | Albums | PK__Albums__97B4BE379FC780BD | PRIMARY KEY | +--------------+-------------------------------+-------------------+
ワイルドカード(*
)を使用する例を次に示します。 )
Artists
の制約のすべてのデータを返す文字 テーブル:
SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Artists';
結果:
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 TABLE_CATALOG | Music TABLE_SCHEMA | dbo TABLE_NAME | Artists CONSTRAINT_TYPE | PRIMARY KEY IS_DEFERRABLE | NO INITIALLY_DEFERRED | NO
例6–key_constraintsシステムビュー
sys.key_constraints
システムビューには、主キーまたは一意性制約である各オブジェクトの行が含まれています。したがって、次のコードを使用して、データベース内のすべての主キー制約と、各主キーに関連するテーブルを返すことができます。
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name FROM sys.key_constraints WHERE type = 'PK';
結果:
+---------+-------------------------------+ | Table | name | |---------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | +---------+-------------------------------+
もちろん、WHERE
を削除することもできます 主キーとの両方を返す句 一意のキー。
前の例では、OBJECT_NAME()
を使用しています object_idではなく、親テーブル名を返す関数。 OBJECT_NAME()
を使用しなかった場合 関数の場合、結果は次のようになります。
SELECT parent_object_id, name FROM sys.key_constraints WHERE type = 'PK';
結果:
+--------------------+-------------------------------+ | parent_object_id | name | |--------------------+-------------------------------| | 885578193 | PK__Artists__25706B50FCD918B1 | | 917578307 | PK__Genres__0385057E88BB96F8 | | 949578421 | PK__Albums__97B4BE379FC780BD | +--------------------+-------------------------------+
parent_object_id
親オブジェクトの名前の代わりにが返されます。 OBJECT_NAME()
関数を使用すると、各キーがどのテーブルに適用されているかを簡単に理解できます。
ワイルドカード(*
)を使用する例を次に示します。 )
Albums
の主キーのすべての列を返す文字 テーブル:
SELECT * FROM sys.key_constraints WHERE type = 'PK' AND OBJECT_NAME(parent_object_id) = 'Albums';
結果:
name | PK__Albums__97B4BE379FC780BD object_id | 965578478 principal_id | NULL schema_id | 1 parent_object_id | 949578421 type | PK type_desc | PRIMARY_KEY_CONSTRAINT create_date | 2019-05-02 12:56:06.377 modify_date | 2019-05-02 12:56:06.377 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 unique_index_id | 1 is_system_named | 1 is_enforced | 1
例7–sys.objectsシステムビュー
sys.objects
システムビューには、データベース内に作成されたユーザー定義のスキーマスコープオブジェクトごとの行が含まれます。したがって、テーブルと主キーが含まれています。
前のクエリを取得して、key_constraints
を置き換えることができます objects
を使用 同じ結果が得られます:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name FROM sys.objects WHERE type = 'PK';
結果:
+---------+-------------------------------+ | Table | name | |---------+-------------------------------| | Artists | PK__Artists__25706B50FCD918B1 | | Genres | PK__Genres__0385057E88BB96F8 | | Albums | PK__Albums__97B4BE379FC780BD | +---------+-------------------------------+
PK__Genres__0385057E88BB96F8 のすべてのデータを返す例を次に示します。 主キー:
SELECT * FROM sys.objects WHERE name = 'PK__Genres__0385057E88BB96F8';
結果(垂直出力を使用):
name | PK__Genres__0385057E88BB96F8 object_id | 933578364 principal_id | NULL schema_id | 1 parent_object_id | 917578307 type | PK type_desc | PRIMARY_KEY_CONSTRAINT create_date | 2019-05-02 12:56:06.110 modify_date | 2019-05-02 12:56:06.110 is_ms_shipped | 0 is_published | 0 is_schema_published | 0
例8–REFERENTIAL_CONSTRAINTSシステムビュー
これは少し難しいですが、状況によっては役立つ場合があります。そして技術的には、(いくつかの)主キーを返します。
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
システムビューは、FOREIGN KEY
ごとに1行を返します 現在のデータベースの制約。したがって、その目的は実際には主キーではなく外部キーを返すことです。ただし、このビューは、外部キーが関連付けられているすべての主キーのみを表示する場合に便利です。関連する外部キーがあるかどうかに関係なく、すべての主キーを表示する場合は、信頼できる方法ではありません。
次に例を示します:
SELECT CONSTRAINT_NAME, UNIQUE_CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS;
結果:
+-------------------+-------------------------------+ | CONSTRAINT_NAME | UNIQUE_CONSTRAINT_NAME | |-------------------+-------------------------------| | FK_Albums_Artists | PK__Artists__25706B50FCD918B1 | | FK_Albums_Genres | PK__Genres__0385057E88BB96F8 | +-------------------+-------------------------------+
ご覧のとおり、これは外部キーが関連付けられている主キーのみを返します。より正確には、実際にはその逆です。すべての外部キーと、それに関連付けられたUNIQUE
を返します。 制約。
したがって、これらの結果を前の例の結果と比較すると、2つの主キーのみが返されることがわかります(前の例の3つと比較して)。これは、このデータベースの主キーの1つ( PK__Albums__97B4BE379FC780BD )関連する外部キーがありません。
これは、
PK__Artists__25706B50FCD918B1
の外部キーのすべてのデータを返す例です。 UNIQUE
です 制約:
SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE UNIQUE_CONSTRAINT_NAME = 'PK__Artists__25706B50FCD918B1';
結果:
CONSTRAINT_CATALOG | Music CONSTRAINT_SCHEMA | dbo CONSTRAINT_NAME | FK_Albums_Artists UNIQUE_CONSTRAINT_CATALOG | Music UNIQUE_CONSTRAINT_SCHEMA | dbo UNIQUE_CONSTRAINT_NAME | PK__Artists__25706B50FCD918B1 MATCH_OPTION | SIMPLE UPDATE_RULE | NO ACTION DELETE_RULE | NO ACTION
この場合、1つの外部キーのみが返されます。
前述のように、このビューは主に外部キー情報を返すためのものであるため、関連する主キーとともに外部キー情報を表示する場合にのみ、このメソッドを使用してください。外部キーが関連付けられているかどうかに関係なく、すべての主キーを表示する場合は、この方法を使用しないでください。
例9–sp_fkeysシステムストアドプロシージャ
このメソッドは、外部キー情報を返すという意味で、前のメソッドと似ています。また、各外部キーに関連付けられた主キーを返します。
例:
EXEC sp_fkeys Artists;
結果(垂直出力を使用):
PKTABLE_QUALIFIER | Music PKTABLE_OWNER | dbo PKTABLE_NAME | Artists PKCOLUMN_NAME | ArtistId FKTABLE_QUALIFIER | Music FKTABLE_OWNER | dbo FKTABLE_NAME | Albums FKCOLUMN_NAME | ArtistId KEY_SEQ | 1 UPDATE_RULE | 1 DELETE_RULE | 1 FK_NAME | FK_Albums_Artists PK_NAME | PK__Artists__25706B50FCD918B1 DEFERRABILITY | 7
代わりに次の構文(またはこれらの引数の組み合わせ)を使用することもできます:
EXEC sp_fkeys @pktable_name = Artists, @pktable_owner = dbo, @pktable_qualifier = Music, @fktable_name = Albums, @fktable_owner = dbo, @fktable_qualifier = Music;
前の例と同様に、このメソッドはすべての主キーを返すために信頼されるべきではありません。主キーに外部キーが関連付けられていない場合、そのキーは返されません。
例10–sp_helpconstraintシステムストアドプロシージャ
sp_helpconstraint
システムストアドプロシージャは、すべての制約タイプ、それらのユーザー定義またはシステム提供の名前、それらが定義されている列、および制約を定義する式(DEFAULT
の場合)のリストを返します。 およびCHECK
制約のみ)。
したがって、これを使用して、データベース内の主キーに関する情報を返すことができます。
例:
EXEC sp_helpconstraint Albums;
結果:
+---------------+ | Object Name | |---------------| | Albums | +---------------+ -[ RECORD 1 ]------------------------- constraint_type | FOREIGN KEY constraint_name | FK_Albums_Artists delete_action | No Action update_action | No Action status_enabled | Enabled status_for_replication | Is_For_Replication constraint_keys | ArtistId -[ RECORD 2 ]------------------------- constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replication | constraint_keys | REFERENCES Music.dbo.Artists (ArtistId) -[ RECORD 3 ]------------------------- constraint_type | FOREIGN KEY constraint_name | FK_Albums_Genres delete_action | No Action update_action | No Action status_enabled | Enabled status_for_replication | Is_For_Replication constraint_keys | GenreId -[ RECORD 4 ]------------------------- constraint_type | constraint_name | delete_action | update_action | status_enabled | status_for_replication | constraint_keys | REFERENCES Music.dbo.Genres (GenreId) -[ RECORD 5 ]------------------------- constraint_type | PRIMARY KEY (clustered) constraint_name | PK__Albums__97B4BE379FC780BD delete_action | (n/a) update_action | (n/a) status_enabled | (n/a) status_for_replication | (n/a) constraint_keys | AlbumId
例11–sp_helpシステムストアドプロシージャ
sp_help
システムストアドプロシージャは、データベースオブジェクト(sys.sysobjects
にリストされているオブジェクト)に関する情報を報告します 互換表示)、ユーザー定義のデータ型、またはデータ型。これには、主キーに関する情報が含まれます。
引数なしでこれを実行すると、現在のデータベースに存在するすべてのタイプのオブジェクトの要約情報に関する情報が返されます(つまり、ロット 情報の)。
ただし、テーブルの名前を指定すると、そのテーブルに関する情報が返されます。繰り返しになりますが、多くの情報が返されますが、その中には主キー情報が含まれます。
例:
EXEC sp_help Artists;
結果:
+---------+---------+------------+-------------------------+ | Name | Owner | Type | Created_datetime | |---------+---------+------------+-------------------------| | Artists | dbo | user table | 2019-05-02 12:56:05.840 | +---------+---------+------------+-------------------------+ -[ RECORD 1 ]------------------------- Column_name | ArtistId Type | int Computed | no Length | 4 Prec | 10 Scale | 0 Nullable | no TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | NULL -[ RECORD 2 ]------------------------- Column_name | ArtistName Type | nvarchar Computed | no Length | 510 Prec | Scale | Nullable | no TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | SQL_Latin1_General_CP1_CI_AS -[ RECORD 3 ]------------------------- Column_name | ActiveFrom Type | date Computed | no Length | 3 Prec | 10 Scale | 0 Nullable | yes TrimTrailingBlanks | (n/a) FixedLenNullInSource | (n/a) Collation | NULL +------------+--------+-------------+-----------------------+ | Identity | Seed | Increment | Not For Replication | |------------+--------+-------------+-----------------------| | ArtistId | 1 | 1 | 0 | +------------+--------+-------------+-----------------------+ +-------------------------------+ | RowGuidCol | |-------------------------------| | No rowguidcol column defined. | +-------------------------------+ +-----------------------------+ | Data_located_on_filegroup | |-----------------------------| | PRIMARY | +-----------------------------+ +-------------------------------+---------------------------------------------------+--------------+ | index_name | index_description | index_keys | |-------------------------------+---------------------------------------------------+--------------| | PK__Artists__25706B50FCD918B1 | clustered, unique, primary key located on PRIMARY | ArtistId | +-------------------------------+---------------------------------------------------+--------------+ -[ RECORD 1 ]------------------------- constraint_type | PRIMARY KEY (clustered) constraint_name | PK__Artists__25706B50FCD918B1 delete_action | (n/a) update_action | (n/a) status_enabled | (n/a) status_for_replication | (n/a) constraint_keys | ArtistId +--------------------------------------+ | Table is referenced by foreign key | |--------------------------------------| | Music.dbo.Albums: FK_Albums_Artists | +--------------------------------------+
主キーの名前を指定して、主キーに関する基本情報を取得することもできます。
EXEC sp_help PK__Artists__25706B50FCD918B1;
結果:
+-------------------------------+---------+-----------------+-------------------------+ | Name | Owner | Type | Created_datetime | |-------------------------------+---------+-----------------+-------------------------| | PK__Artists__25706B50FCD918B1 | dbo | primary key cns | 2019-05-02 12:56:05.853 | +-------------------------------+---------+-----------------+-------------------------+