在一个外键列设置为空值?(set null value in a foreign key colum

2019-09-22 14:44发布

我有这样的表

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手动? 如果通过任何手段是不可能的,什么是规避我所描述的情况,最好的方法是什么?

Answer 1:

如果CityId设置为NULL ,则外键约束将不检查,一切都会好的。

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

在复合键外键约束,如果涉及的所有列的是非只检查NULL



Answer 2:

更改insert query @

[CityId] [int] DEFAULT NULL

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



文章来源: set null value in a foreign key column?