Raz*_*t4x 10 sql-server constraints foreign-keys relational-database relationship
我有这张桌子
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
)
)
Run Code Online (Sandbox Code Playgroud)
和另一张桌子
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]
Run Code Online (Sandbox Code Playgroud)
如您所见,有一个外键CityId, BranchId.我遇到的问题是,如果用户没有进入他的城市(他可以选择不,这个字段不是强制性的,那么这CityId将是空白的,当我尝试在CustomerMaster表中插入此值时,我得到此错误说
INSERT语句与FOREIGN KEY约束"fk_cdCityId_CityId"冲突.冲突发生在数据库"TestDatabase",表"dbo.CityMaster"中.该语句已终止.
所以,我想知道一种绕过这个的方法.我知道如果将唯一或主键列引用为外键,则它不能为空.但是,当我设定的时候
on delete set null呢?在这种情况下,如果该行从删除,CityMaster将它设置为null在CustomerMaster(我的意思是它的所有引用).那么,如果可能的原因以及如何null手动设置此外键中的值?如果这无法通过任何方式实现,那么绕过我描述的情况的最佳方法是什么?
Dam*_*ver 18
如果CityId设置为NULL,则不会检查外键约束,一切都会好.
在另一方面,如果CityId是0(比如,因为您所指定DEFAULT ((0))就可以了...),并没有匹配的行CityMaster为0,BranchId,那么这将导致确实的约束检查失败.
仅当涉及的所有列都是非列时,才会检查复合键上的外键约束NULL.
| 归档时间: |
|
| 查看次数: |
19015 次 |
| 最近记录: |