回答

收藏

SQL Server 2005:可空外键约束

技术问答 技术问答 164 人阅读 | 0 人回复 | 2023-09-14

我在表Sessions和Users两者之间有外键约束。具体来说,Sessions.UID =
& B; E$ x2 `$ R, T: R4 ]- S3 jUsers.ID。有时候,我希望Sessions.UID为null。可以允许吗?每当我试图执行此操作时,我都会收到它FK约束违规。2 g: ~- H' r& ]% x
具体来说,我通过了LINQ在Sessions插入一行。我设置了。Session.User = null; 我犯了这个错误:
4 J1 u, ?8 u$ ?7 x) _$ }* `试着删除用户和会话之间的关系。然而,关系的外键之一(Session.UID)不能设置为null。但是,当我删除使User当属性为空时,我在SubmitChanges收到这个错误:
% [6 Z7 k1 [5 M; F4 q& }值不能为空。参数名称:缺点表里没有一个叫
; B/ a, s. @3 T  j* W  fcons字段,在我的5500行DataContext.designer.cs文件中没有字段QuickWatch没有相关对象的字段,所以我不知道7 V9 |3 p3 e4 W* g! R) A
cons”是什么。: _8 B' L1 k9 d, R
在数据库中,Session.UID是可为null的int字段,而User.ID是不可为null的int字段UID我宁愿用对的会话FK记录关系的约束。有没有办法做到这一点?' ?+ l9 Y  G/ O1 {2 }1 `6 s: w6 f
                                                               
. ^$ I( }0 C7 V+ b  @6 x" h    解决方案:                                                               
5 U$ ~! I- y6 q  z5 @+ i                                                                我似乎记得我以前创造过一个空的FK,所以我做了一个快速测试。正如你在下面看到的,它绝对可行(在MSSQL 2005上测试)。+ o$ ?, r% d4 j- U6 ]$ y$ n( Z) O( C
编写表格和约束的脚本并发布,以便进一步消除故障。0 n1 q& e+ z  i
CREATE DATABASE [NullableFKTest]GOUSE [NullableFKTest]GOCREATE TABLE OneTable  OneId  [int] NOT NULL,   CONSTRAINT [PK_OneTable] PRIMARY KEY CLUSTERED          [OneId] ASC   )CREATE TABLE ManyTable (ManyId  [int] IDENTITY(1,1) NOT NULL,OneId [int] NULL)GOIF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_ManyTable_OneTable]') AND parent_object_id = OBJECT_ID(N'[dbo].[ManyTable]') )ALTER TABLE [dbo].[ManyTable]  WITH CHECK ADD CONSTRAINT [FK_ManyTable_OneTable] FOREIGN KEY([OneId])    REFERENCES [dbo].[OneTable] ([OneId])   GO--let's get a value in hereinsert into OneTable(OneId) values(1)select* from OneTable--let's try creating a valid relationship to the FK table OneTableinsert into ManyTable(OneId) values (1) --fine--now,let's try NULLinsert into ManyTable(OneId) values (NULL) --also fine--how about a non-existent OneTable entry?insert into ManyTable(OneId) values (5) --BOOM! - FK violationselect* from ManyTable--1,1--2,NULL--cleanupALTER TABLE ManyTable DROP CONSTRAINT FK_ManyTable_OneTableGOdrop TABLE OneTableGOdrop TABLE ManyTableGOUSE [Master]GODROP DATABASE NullableFKTest
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则