10

我有这个表在外键列中设置空值?

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表中插入这个值时,我得到这个错误说

INSERT语句冲突与外键约束“fk_cdCityId_CityId”。该冲突发生于数据库“TestDatabase”,表“dbo.CityMaster”。 该语句已终止。

所以,我想知道一种解决这个问题的方法,我知道如果一个唯一或主键列被引用为外键,它不能为空。但是,当我设置了 on delete set null?在这种情况下,如果该行从CityMaster中删除,它将被设置为nullCustomerMaster(我的意思是它的所有参考)。所以,如果这是可能的,为什么以及如何手动设置这个外键null的值? 如果无法做到这一点,那么规避我所描述的情况的最好办法是什么?

回答

17

如果CityId设置为NULL,那么外键约束将不会被检查,并且都是好的。

在另一方面,如果CityId为0(比方说,因为你已经指定就可以了... DEFAULT ((0))),并且有在CityMaster没有匹配的行为0,BranchId,那么这将导致确实的约束检查失败。

只有在所涉及列的所有都不是NULL时,才会检查组合键上的外键约束。

+0

@达明最不信: 所以,我应该删除这个'默认值(0)'条款? – Razort4x

+1

@ Razort4x - 我会这么说,是的。 –

+0

不错,它没有帮助我 –

3

变化insert query @

[CityId] [int] DEFAULT NULL 

这将允许你存储Null值你宣布它为默认。