問題:
SQLServerデータベースの制約のデフォルト名を知りたい。
例:
データベースに、country およびstudent 、次の制約があります:PRIMARY KEY (列id テーブル内country およびstudent )、FOREIGN KEY (列country_id テーブル内student )、DEFAULT (列name テーブル内student )、UNIQUE (列name テーブル内country および列personal_number テーブル内student )、およびCHECK (列age テーブル内student 。
解決策:
CREATE TABLE country ( id int NOT NULL primary key, name varchar(100) UNIQUE ); CREATE TABLE student ( id int NOT NULL primary key, name varchar(100) NOT NULL DEFAULT 'unknown', personal_number varchar(100) UNIQUE, age int CHECK(age>15), country_id int FOREIGN KEY references country(id) );
SQLServerがデフォルトでこれらのテーブルの制約にどのように名前を付けるかを表示してみましょう。このクエリを使用してそれらを確認します:
SELECT TABLE_CATALOG, TABLE_NAME,
CONSTRAINT_TYPE,CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
結果は次のとおりです。
| TABLE_NAME | CONSTRAINT_TYPE | CONSTRAINT_NAME |
|---|---|---|
| 国 | 主キー | PK__country__3213E83F7EFD826D |
| 国 | ユニーク | UQ__country__72E12F1BB69A1D8C |
| 学生 | 主キー | PK__student__3213E83F357C7D1D |
| 学生 | ユニーク | UQ__student__24E2EDD2AC2A7D87 |
| 学生 | チェック | CK__student__age__4E88ABD4 |
| 学生 | 外部キー | FK__student__country__4F7CD00D |
ディスカッション:
テーブルを作成するときに、いくつかの列に制約を設定します。ただし、これらの制約の名前は指定していないため、デフォルトで名前が付けられています。制約のデフォルト名はどのように生成されますか?
SQL Serverでは、デフォルトの制約名は特定のプレフィックスで始まります:PK 、UQ 、CK 、またはFK 。
PRIMARY KEYのデフォルト名 制約は「PK」で始まります ’の後に下線が続きます(‘ __ ’)、テーブル名、その他のアンダースコア(‘ __ ’)、およびSQLServerによって生成された16進数のシーケンス番号。この例では、PK__country__3213E83F7EFD826D テーブルcountry およびPK__student__3213E83F357C7D1D テーブルstudent 。
FOREIGN KEYのデフォルト名 制約は「FK」で始まります ’の後に下線が続きます(‘ __ ’)、テーブル名、その他のアンダースコア(‘ __ ’)、関連するテーブルの名前、およびSQLServerによって生成された16進数のシーケンス番号。この例では、FK__student__country__4F7CD00D テーブルstudent これは、列idに相当します テーブル内country 。
UNIQUEのデフォルト名 制約は「UQ」です ’、下線(‘ __ ’)、テーブル名、その他のアンダースコア(‘ __ ’)、およびSQLServerによって生成された16進数のシーケンス番号。この例では、UQ__country__72E12F1BB69A1D8C テーブルcountry 、およびUQ__student__24E2EDD2AC2A7D87 UNIQUEの テーブルの列名の制約student 。 UNIQUE 複数の列を持つ制約には、同様のパターンで名前が付けられます。
CHECKのデフォルト名 制約は「CK」です ’、下線(‘ __ ’)、テーブル名、その他のアンダースコア(‘ __ ’)、列名、その他のアンダースコア(‘__’)、およびSQLServerによって生成された16進数のシーケンス番号。この例では、CK__student__age__4E88ABD4 CHECKのデフォルト名です 列ageの制約 テーブルのstudent 。