当前位置: 首页 > 面试题库 >

SQL Server 2005:可空的外键约束

东门彬
2023-03-14
问题内容

我在表Sessions和Users之间有一个外键约束。具体来说,Sessions.UID =
Users.ID。有时,我希望Sessions.UID为null。可以允许吗?每当我尝试执行此操作时,都会收到FK约束违规。

具体来说,我是通过LINQ在Sessions中插入一行。我设置了Session.User = null; 我得到这个错误:

试图删除用户和会话之间的关系。但是,关系的外键之一(Session.UID)不能设置为null。

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

值不能为空。
参数名称:缺点

我的表中都没有一个名为“
cons”的字段,在我的5500行的DataContext.designer.cs文件中也没有该字段,在QuickWatch中也没有任何相关对象的字段,因此我不知道“
cons”是什么。

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


问题答案:

我似乎记得以前曾创建过一个可为空的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


 类似资料:
  • mysql 5.7 外键约束 主表:部门表 从表:员工表 添加外键:从表 dep_id 关联 主表 id >[danger] CASCADE > 级联更新 主表数据更新从表会更新外键 级联删除 主表数据删除,从表会一起删除

  • 主要内容:在创建表时设置外键约束,在修改表时添加外键约束,删除外键约束MySQL外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西

  • 注意 当前章节中涉及的配置一般适用于关系数据库。这里展示的扩展方法在你安装了关系数据库提供程序之后就能获得(由Microsoft.EntityFrmeworkCore.Relational 程序包共享)。 外键约束是为模型中的关系引入的。 惯例 按照惯例,外键约束命名为 FK_<依赖实体类型名称>_<主实体类型名称>_<外键属性名称>。对于组合键,<外键属性名> 则为用下划线分隔的外键属性名。 数

  • 问题内容: 在事务SQL中,如何指定外键约束应为1:1关系?声明列UNIQUE是否足够?下面是我现有的代码。 问题答案: 具有UNIQUE和NOT NULL约束的外键列在另一个表中引用UNIQUE,NOT NULL列会创建1:(0 | 1)关系,这可能就是您想要的。 如果存在真正的1:1关系,则第一个表中的每个记录在第二个表中都会有一个对应的记录,反之亦然。在这种情况下,您可能只想制作一张表(除非

  • 问题内容: 我有这两张表 Table: Guards Table: Squads 该列指向表中的列,我正在尝试创建一个约束,以检查链接到作为领导者提供的保护ID的列是否为特定值(在本例中为1) 这可能吗?还是我必须使用扳机? 问题答案: 您需要添加一个约束。我将约束包装到一个函数中,因为您需要检查另一个表的值。 该函数将检查防护等级是否足够高:请确保将其设置为适当的值,或者甚至更好地从另一个表中获

  • 问题内容: 我收到此错误消息: 第40行的错误1217(23000):无法删除或更新父行:外键约束失败 …当我尝试放置桌子时: …定义如下: 有趣的是, 我已经删除 了模式中具有外键的 所有其他表。实际上,除了表外,数据库是空的。 如果数据库中没有其他对象,怎么可能会有子行?据我所知,InnoDB不允许在其他模式上使用外键,对吗? (我什至可以运行命令:-?) 问题答案: 两种可能性: 在另一个架