SQL Serverの外部キー関係は、外部キーも空にすることができ、必須制約である(NULL)

SQL Serverでは、実際には、外部キーの値が空にすることができます(NULL)、および外部キーの関係にかかわらず、制約の必須ではありません。

 

私たちは、最初のSQL Serverデータベースと二つのテーブルの人々の車を確立し、人々は車以上のものを持つことができるので、2つのテーブルは一対多の関係です。

 

人々はtable文を構築します:

CREATE  TABLEを [ DBO ][ ピープル] [ ID ]  [ INT ]  NOT  NULL [ 名前]  、[ データ型はnvarchar ]50NULL [ 年齢]  [ INT ]  NULL [ セックス]  [ データ型はnvarchar ]50NULL 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 =  ONON  [ PRIMARY ] ON  [ PRIMARY ] 
GO

ID列が主キーテーブルの人々であります

 

カー建てtable文:

CREATE  TABLEを [ DBO ][ ] [ ID ]  [ INT ]  NOT  NULL [ ブランド]  [ NVARCHAR ]50NULL [ 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 =  ONON  [ 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)である外部キー必須の外部キー制約を受けません。

 

おすすめ

転載: www.cnblogs.com/OpenCoder/p/11140645.html