問題:
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
。