既存の回答はかなり薄いので、いくつかの詳細を追加したいと思います。
最も重要なヒントは次のとおりです。明示的な名前なしで制約を作成することは絶対にしないでください。
名前のない制約の最大の問題:これをさまざまなカスタマーマシンで実行すると、それぞれに異なる名前またはランダムな名前が付けられます。
任意の将来のアップグレード・スクリプトは、実際の頭痛の種になります...
一般的なアドバイスは次のとおりです。
- 名前なしの制約はありません!
- いくつかの命名規則を使用してください。
DF_TableName_ColumnName
デフォルトの制約
CK_TableName_ColumnName
チェック制約の場合
UQ_TableName_ColumnName
一意の制約
PK_TableName
主キー制約
一般的な構文は
TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>
こちらをお試しください
コンマの後に列を追加するのと同じように、各列にさらに制約を追加でき、さらに制約を追加できます。
CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
--define the primary key
ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY
--let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE
--define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)
--add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)
--add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO
-データを挿入します
INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK)
VALUES('fails due to uniqueness of 111,1',111,1);