SQL Serverでは、実際には、外部キーの値が空にすることができます(NULL)、および外部キーの関係にかかわらず、制約の必須ではありません。
私たちは、最初のSQL Serverデータベースと二つのテーブルの人々の車を確立し、人々は車以上のものを持つことができるので、2つのテーブルは一対多の関係です。
人々はtable文を構築します:
CREATE TABLEを [ DBO ]。[ ピープル] ( [ ID ] [ INT ] NOT NULL 、 [ 名前] 、[ データ型はnvarchar ](50)NULL 、 [ 年齢] [ INT ] NULL 、 [ セックス] [ データ型はnvarchar ](50)NULL 、 CONSTRAINT [ PK_People ] PRIMARY KEY CLUSTERED ( [ ID ] ASC )WITH(PAD_INDEX = OFF、STATISTICS_NORECOMPUTE = OFF、IGNORE_DUP_KEY = OFF、ALLOW_ROW_LOCKS = ON、ALLOW_PAGE_LOCKS = ON)ON [ PRIMARY ] )ON [ PRIMARY ] GO
ID列が主キーテーブルの人々であります
カー建てtable文:
CREATE TABLEを [ DBO ]。[ 車] ( [ ID ] [ INT ] NOT NULL 、 [ ブランド] [ NVARCHAR ](50)NULL 、 [ PeopleID ] [ INT ] NULL 、 CONSTRAINT [ PK_Car ] PRIMARY KEY CLUSTERED ( [ ID ] ASC )WITH(PAD_INDEX= OFF、STATISTICS_NORECOMPUTE = OFF、IGNORE_DUP_KEY = OFF、ALLOW_ROW_LOCKS = ON、ALLOW_PAGE_LOCKS = ON)ON [ PRIMARY ] )ON [ PRIMARY ] GO ALTER TABLE [ DBO ]。[ 車] WITH CHECKの ADDの CONSTRAINT [ FK_Car_People ] FOREIGN KEY([ PeopleID ] ) REFERENCES [ DBO ]。[ 人]([ ID ] ) GO ALTER TABLE [ DBO ]。[ 車] のチェック 制約は、 [ FK_Car_People ] GO
ID列が主キーテーブルの車であり、さらに列PeopleID車のテーブルは、外部キー、それに関連付けられたIDの人々のテーブルの主キーです。我々はまた、(テーブルや車の人々表[FK_Car_People]間の外部キー関係として必須制約を設定CHECK)。
ここでは、人々のための2つのデータテーブルを挿入します。
INSERT INTO [ DBO ]。[ 人] (ID、名前、年齢、性別) VALUES (1、N ' ジョン・ドウ'、25、N ' M ' )、 (2、N ' ジョン・ドウ'、26は、N ' F ");
次のようにクエリ結果は以下のとおりです。
その後、我々は5つのデータ・テーブル・カーを挿入します。
INSERT INTO [ DBO ]。[ 車] (ID、ブランド、peopleid) VALUES (1、N ' ベンツ'、1 )、 (2、N ' BMW '、1 )、 (3、N ' 公共'、2 )、 (4、N ' ビュイック'、NULL )、 (5、N ' トヨタ'、NULL);
我々は最後の二つのデータ「ビュイック」と「トヨタ」は、車のテーブルの外部キー列PeopleIDにNULL値(NULL)を挿入することに注意してください。しかし声明は、エラーではありませんでした5件のデータが正常に挿入されている次のように、クエリの結果は次のとおりです。
したがって、カーPeopleIDテーブルの外部キー列が空(NULL)することができ、および外部キーの関係[FK_Car_People]は(必須制約はないCHECK)無関係な、とあなたは車が空の外部キー列をPeopleID許すだけのテーブル(NULL)関連。
今、私たちはテーブルPeopleIDカーの外部キー列ではなく、5の前に再びデータを挿入し、(NULL)は空であることを許可しています:
DELETE FROM [ DBO ]。[ 車] ALTER TABLE [ DBO ]。[ カーは] ALTER COLUMN [ PeopleID ] INT NOT NULL INSERT INTOを [ DBO ]。[ 車] (ID、ブランド、PeopleID) VALUES (1、N ' 奔驰を'、1 )、 (2、N ' 宝马'、1)、 (3、N ' 公共'、2 )、 (4、N ' ビュイック'、NULL )、 (。5、N ' トヨタ'、NULL);
そして、外部キー列のテーブルカーPeopleIDが空ではないため、ステートメントは、(NULL)、与えられます挿入します。
したがって、SQL Serverの外部キー関係が制約を強制するために、制約は、実際には非NULL外部キー、ヌル値(NULL)である外部キー必須の外部キー制約を受けません。