SQL Server 2005:可为空的外键约束

2024-04-01

我在表会话和用户之间有外键约束。具体来说,Sessions.UID = Users.ID。有时,我希望 Sessions.UID 为空。这可以被允许吗?每当我尝试这样做时,我都会遇到 FK 约束违规。

具体来说,我通过 LINQ 将一行插入到 Sessions 中。我设置 Session.User = null;我收到此错误:


An attempt was made to remove a relationship between a User and a Session. However, one of the relationship's foreign keys (Session.UID) cannot be set to null.  

但是,当我删除将 User 属性清空的行时,我在 SubmitChanges 行上收到此错误:


Value cannot be null.
Parameter name: cons  

我的所有表都没有名为“cons”的字段,它也不在我的 5,500 行 DataContext.designer.cs 文件中,也不在任何相关对象的 QuickWatch 中,所以我不知道“cons”是什么。

在数据库中,Session.UID 是一个可为 null 的 int 字段,而 User.ID 是一个不可为 null 的 int 字段。我想记录可能有或没有 UID 的会话,并且我宁愿在不禁用对该 FK 关系的约束的情况下进行记录。有没有办法做到这一点?


我似乎记得之前创建了一个可为 null 的 FK,所以我进行了一个快速测试。如下所示,这绝对是可行的(在 MSSQL 2005 上测试)。

编写表和约束的相关部分的脚本并将其发布,以便我们可以进一步排除故障。

CREATE DATABASE [NullableFKTest]
GO
USE [NullableFKTest]
GO
CREATE 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)
GO
IF 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 here
insert into OneTable(OneId) values(1)
select* from OneTable

--let's try creating a valid relationship to the FK table OneTable
insert into ManyTable(OneId) values (1) --fine
--now, let's try NULL
insert into ManyTable(OneId) values (NULL) --also fine
--how about a non-existent OneTable entry?
insert into ManyTable(OneId) values (5) --BOOM! - FK violation

select* from ManyTable
--1, 1
--2, NULL

--cleanup
ALTER TABLE ManyTable DROP CONSTRAINT FK_ManyTable_OneTable
GO
drop TABLE OneTable
GO
drop TABLE ManyTable
GO
USE [Master]
GO
DROP DATABASE NullableFKTest
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2005:可为空的外键约束 的相关文章

随机推荐