10

あなたが見ることができるように、私はこのテーブル外部キー列にNULL値を設定していますか?

CREATE TABLE [dbo].[CityMaster](
    [CityID] [int] NOT NULL, 
    [City] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CityM__Branc__74444068] DEFAULT ((0)), 
    [ExternalBranchId] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_CityMaster] PRIMARY KEY CLUSTERED 
(
    [City] ASC, 
    [BranchId] ASC 
), 
CONSTRAINT [uk_citymaster_cityid_branchid] UNIQUE NONCLUSTERED 
(
    [CityID] ASC, 
    [BranchId] ASC 
) 
) 

と別のテーブル

CREATE TABLE [dbo].[CustomerMaster](
    [ID] [int] NOT NULL, 
    [CustomerCode] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [CustomerName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [CustomerAddress] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, 
    [CustomerPhone] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [CustomerEmailId] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
    [CustomerPriority] [int] NOT NULL CONSTRAINT [DF_CustomerMaster_CustomerPriority] DEFAULT ((0)), 
    [CustomerRegisterDate] [datetime] NULL, 
    [CustomerIsActive] [bit] NULL CONSTRAINT [DF_CustomerMaster_CustomerIsActive] DEFAULT ((1)), 
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CustomerM__Branc__67DE6983] DEFAULT ((0)), 
    [CityId] [int] NULL CONSTRAINT [DF_CustomerMaster_CityId] DEFAULT ((0)), 
CONSTRAINT [PK_CustomerMaster] PRIMARY KEY CLUSTERED 
(
    [CustomerCode] ASC, 
    [BranchId] ASC 
) 
) ON [PRIMARY] 

ALTER TABLE [dbo].[CustomerMaster] WITH CHECK ADD CONSTRAINT [fk_cdCityId_CityId] FOREIGN KEY([CityId], [BranchId]) 
REFERENCES [dbo].[CityMaster] ([CityID], [BranchId]) 

ALTER TABLE [dbo].[CustomerMaster] CHECK CONSTRAINT [fk_cdCityId_CityId] 

を持って、CityId, BranchIdの外部キーがあります。私が抱えている問題は、ユーザが彼の都市に入場しないと(このフィールドは必須ではなく、このフィールドは必須ではなく、CityIdは空白になります)、この値をCustomerMasterテーブルに挿入しようとすると、 FOREIGN KEY制約 "fk_cdCityId_CityId" と競合

INSERT文が。競合が "TestDatabase"、テーブル "dbo.CityMaster" データベースで発生した。 の文が終了したと述べた。

ので、エラー、私は、これを回避する方法を知りたいのですが、一意のキー列または主キー列が外部キーとして参照されているかどうかはわかりますが、NULLにすることはできません。on delete set null?その場合、その行がCityMasterから削除された場合、nullCustomerMaster(すべての参照を意味します)に設定されます。もしそれが可能ならば、私はこの外部キーの値を手動でnullに設定できますか? それが何とかできないのなら、私が説明した状況を回避する最善の方法は何ですか?

答えて

17

CityIdNULLに設定されている場合、外部キー制約はチェックされず、すべて良好になります。一方

CityIdは0(たとえば、あなたがそれにDEFAULT ((0))を指定したので...)で、一致する行が0,BranchIdためCityMasterにありませんならば、これは確かに制約チェックが失敗します。

複合キーの外部キー制約は、のすべての列のNULLである場合にのみチェックされます。あなたは、デフォルトとして、それを宣言したようinsert query @

[CityId] [int] DEFAULT NULL 

これで

+0

@ damien-the-unbeliever: この 'default(0)'節は削除する必要がありますか? – Razort4x

+1

@ Razort4x - そうだと思います。 –

+0

良い、それは私を助けなかった –

3

変更は、あなたがNull値を格納することができます。

関連する問題