sql-server – 在外键列中设置空值?

前端之家收集整理的这篇文章主要介绍了sql-server – 在外键列中设置空值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个表
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语句与FOREIGN KEY约束“fk_cdCityId_CityId”冲突.冲突发生在数据库“TestDatabase”中,表“dbo.CityMaster”.
该声明已被终止.

所以,我想知道一个方法来规避这个.我知道一个唯一或主键列是否被引用为外键,它不能为空.但是,当我设置的时候,时间呢?
删除集合为null在这种情况下,如果该行从CityMaster中删除,则在CustomerMaster中将其设置为null(我的意思是其所有引用).所以,如果这是可能的,为什么我该如何设置这个外键的值手动?
如果这是不可能的,那么规避我所描述的情况的最好办法是什么?

解决方法

如果CityId设置为NULL,那么外键约束将不被检查,一切都会很好.

另一方面,如果CityId为0(例如,因为您已经指定了DEFAULT((0))…),并且CityMaster中没有匹配的行为0,BranchId,那么这将确实导致约束检查失败.

只有在涉及的所有列都为非NULL时,才会检查复合键上的外键约束.

猜你在找的MsSQL相关文章