2011-09-15 9 views
0

私たちは、Person.car_idがCompanyCar.car_idへの外部キーでなければなりませんが、私はPerson.car_idがNULL可能になりたい(FKがnullでない場合は強制)オプションの関係を実装

Person(person_id, name, car_id) 
CompanyCar(car_id, make, model, colour, plate) 

これらのテーブルがあるとし私は、LINQからSQLへのDataContextを生成するsqlmetal実行したときに存在場合、私は

class Person{ 
    int person_id, 
    string name, 
    int? car_id, 
    CompanyCar companyCar //object references may hold null 
} 

を取得する必要があり、Person.car_idはCompanyCarに存在する必要があります。

私が読んだMSDNの文書によると、これは可能ではありませんでしたが、試してみるとうまくいきました。オンラインでこのタイプの関係について書いたり質問したりする人はほとんどいません。

この外部キーを強制的に実行することはできますか?

UPDATE:ここ は、私が作成したスクリプトのために尋ねられたときSMSSが発生したものです。 FKはNOCHECK として作成されますが、という名前で作成されていますが、CompanyCarテーブルに存在しないことがわかっているCarID(たとえば9999)を入力すると文句を言います。

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Person](
    [PersonID] [int] NOT NULL, 
    [Name] [varchar](100) NOT NULL, 
    [CarID] [int] NULL 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [PersonID] ASC 
)WITH FILLFACTOR = 92 ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[Person] WITH NOCHECK ADD CONSTRAINT [FK_Person_CompanyCar] FOREIGN KEY([CarID]) 
REFERENCES [dbo].[CompanyCar] ([CarID]) 
GO 

(名前の不整合のための謝罪、ジョブは例の命名が必要です)

+2

テーブルと外部キーの作成に使用したSQLを表示してください。外部キーが定義されていて、値が提供されている場合は**チェックされます**。値がNULLの場合、チェックされません。 –

+0

with nocheckは、alter table cmdの時点でpersonテーブルである可能性のある既存のデータを検証しません。 Fkは、personテーブルのすべての新しい挿入と更新でチェックされ、carテーブルのpkの削除と更新が行われます。 –

答えて

1

NULL可能列のFK参照は、あなたが望んでいるとおりに動作します。 NULLでない値が存在する場合、FK制約は正常に強制されます。 NULL値はFK制約によってチェックされません。値は現在不明であり、制約に違反しているかどうかを判断することは不可能です。

関連する問題