子表中的外键约束允许插入父表中不存在的值

2023-11-29

我正在使用 SQL Server 2012。我已经在表上定义了外键约束。外键引用复合主键。当一列具有“00000”而另一列为空时,fk 约束不起作用。父表不包含“00000”。两个 fk 列都有varchar数据类型。

enter image description here

下面是示例:

INSERT INTO XYZ
    ([BUSINESS_PARTNER_ID]
    ,[INDUSTRY_TYPE_CDE]
    ,[INDUSTRY_SUBTYPE_CDE])
VALUES
    (1,
    Null
    '00000')
GO

行业类型和行业子类型列引用自另一个表。 下面是脚本:

ALTER TABLE [nfs].[xyz] WITH NOCHECK 
ADD CONSTRAINT [FK_BPMAIN__ITCDE_ISTCDE] 
FOREIGN KEY([INDUSTRY_TYPE_CDE], [INDUSTRY_SUBTYPE_CDE]) 
REFERENCES [nfs].[abc] ([INDUSTRY_TYPE_CDE], [INDUSTRY_SUBTYPE_CDE]) 
GO 

ALTER TABLE [nfs].[xyz] 
CHECK CONSTRAINT [FK_BPMAIN__ITCDE_ISTCDE] 
GO 

SQL Server 在插入时不会给出任何错误。它将值插入子表中。根据我的理解,fk列可以为空或者应该包含父表中存在的值。


为什么当一列或多列包含 null 时不检查 fk 约束?您能解释一下这种行为吗?

首先,我们有实际的原因。外键是使用索引来维护和检查的。为了使索引可用,我们需要知道索引中所有列的(寻找的)值。如果我们有一个索引/pk(a,b)我们的外键值为(NULL,1), 我们不可以seek索引内以确定是否存在带有b值为 1。这将使外键的维护“昂贵”。

但其次,我们需要考虑一致性。对于单列情况,这是相当没有争议的 - 如果 FK 列中有一个值,那么引用列中需要有一个匹配的值。否则,如果 FK 列是NULL那么就不会检查约束。

但是,我们如何将其扩展到多列呢?什么is上面的规则?没有一个single明显的解释,而是多种解释。上述规则是“如果all列非 NULL,则检查约束”或“如果any列非 NULL,则检查约束”?当仅考虑单个列时,这些规则是相同的。

您期望该规则是第二条,而实际上它是第一条。这是明确的记录在案:

FOREIGN KEY 约束可以包含空值;但是,如果复合 FOREIGN KEY 约束的任何列包含空值,则将跳过对构成 FOREIGN KEY 约束的所有值的验证。要确保验证复合 FOREIGN KEY 约束的所有值,请在所有参与列上指定 NOT NULL。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子表中的外键约束允许插入父表中不存在的值 的相关文章

  • 为表多次指定了 xxx 列

    我正在尝试将 db2 简单查询调整为 SQL SERVER 该查询在 db2 上运行良好 select from pb console users u join select from pb console users user role
  • 为什么我的查询在参数化后会中断?

    我有 2 张桌子 Sales and Product Sales可以将产品存储为Idn or Name 传统设计 和Type列指定实际type与之相关 Product等是连接的子集表into这个表来获取真实的数据 在这个例子中 Produc
  • Postgresql 和 jsonb - 将键/值插入多级数组

    非常类似于这个帖子 https stackoverflow com questions 58959678 postgresql add key to each objects of an jsonb array 但我很难适应他们的解决方案
  • 大表的最佳主键格式

    我正在开发一个 ASP NET 应用程序 它有一些可能很大的数据表 我想知道定义主键的最佳方法是什么 我知道以前已经有人问过这个问题 但由于这是针对特定情况的 所以我认为这个问题是有效的 我在 SQL Server 2008 数据库上使用实
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • 为什么 SQL Server 不推荐使用 SET ANSI_PADDING OFF?

    根据 MSDN BOL 在线书籍 SET ANSI PADDING http msdn microsoft com en us library ms187403 aspx 在 Microsoft SQL Server 的未来版本中 ANSI
  • django pyodbc 数据源名称未找到

    当尝试连接到我的数据库服务器和 Django 中的数据库时 我收到错误 django db utils InterfaceError IM002 IM002 Microsoft ODBC Driver Manager 未找到数据源名称且未指
  • 将服务器添加到 SQL Management Studio

    我想将不同服务器上的一堆 SQL 2000 2005 的混合 服务器实例添加到我的 SSMS SQL Managment Studio 注册服务器 我正在遵循本教程here http sev17 com 2008 12 registerin
  • EF4 和 SQL Server 2000

    我使用 EF4 和 SQL Server 2005 开发了我的网站 但当转移到临时站点时 发现他们使用 SQL Server 2000 现在我收到此错误 我认为该错误与 SQL Server 2000 有关 Incorrect syntax
  • Linq lambda表达式多对多表选择

    我有三个表 其中两个是多对多关系 Picture 这是中间mm表中的数据 Edit 到这里 我得到正确的 4 行返回 但它们都是相同的结果 我知道我需要返回 4 行 但有不同的结果 return this mediaBugEntityDB
  • 默认情况下 dbo 架构中的 EF 6 Code First __MigrationHistory

    我是代码优先实体框架的新手 第一次运行我的应用程序后登录数据库时 当我看到 MigrationHistory 表时 我有点困惑 我现在了解对此表的需求 但不喜欢它位于用户表内的标准 dbo 模式中 我认为它很唐突且有风险 我的第一个想法是将
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 对 SQL 时间序列进行采样

    我有一个日期时间的时间序列 存储在 mySQL 中的双列 并且希望每分钟对时间序列进行采样 即以一分钟的间隔提取最后一个值 有没有一种有效的方法可以在一个 select 语句中执行此操作 蛮力方法将涉及选择整个系列并在客户端进行采样或为每个
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • 从 SQL Server 中的子查询值或其他聚合函数获取平均值

    我有 SQL 语句 SQL Server SELECT COUNT ActionName AS pageCount FROM tbl 22 Benchmark WHERE DATEPART dw CreationDate gt 1 AND
  • max()、分组依据和排序依据

    我有以下 SQL 语句 SELECT t client id max t points AS max FROM sessions GROUP BY t client id 它只是列出了客户 ID 以及他们所获得的最大积分 现在我想按 max
  • Oracle中如何选择前100行?

    我的要求是获取每个客户的最新订单 然后获取前100条记录 我编写了一个如下查询来获取每个客户的最新订单 内部查询工作正常 但我不知道如何根据结果获得前 100 名 SELECT FROM SELECT id client id ROW NU
  • SSIS Master 包执行来自另一个项目的包

    我有多个SSIS项目 但其中的一些包是相同的 我想创建一个包含所有内容的项目generic包并将其他项目与他们的特定包一起保存 所以我的问题是 是否有可能有一个主包可以执行并将父变量传递给另一个项目的包 我是 SSIS 新手 如果这是一个明
  • 随机排列每行的列值

    我正在使用 C NET 开发多项选择题考试生成器 每次做出报告时 都会在数据库中随机挑选问题 并随机调整选项 我可以做随机问题部分 但我不能做选择的洗牌 我有一张表 其中一行如下 question answer distractor1 di

随机推荐

  • 如何让 awk 在打印小值时不使用科学计数法?

    在以下 awk 命令中 awk sum 1 n END avg sum n print Avg monitoring time avg file txt 我应该更改什么来删除科学记数法输出 非常小的值显示为 1 5e 05 我无法成功使用
  • 根据购物车物品重量和购物车金额计算运费

    在客户端 WooCommerce 网站中 订单金额不超过 250 时启用免费送货方式 我使用下面的代码 from 这个答案 当订单金额超过 250 时隐藏其他运费 除非购物车中有重物 add filter woocommerce packa
  • 使用字典计算列表中的项目数

    假设我有一个项目列表 例如 apple red apple red red pear 我想要一个字典来计算每个项目在列表中出现的次数 因此 对于上面的列表 结果应该是 apple 2 red 3 pear 1 我怎样才能用Python简单地
  • c# 在特定时间显示标签中的文本

    有谁知道如何在标签或文本框中显示特定时间的文本 假设如果我单击一个按钮 它会在标签中的文本框中显示输入的文本 15 秒 然后它就会消失 定时器类 代码示例 using System using System Timers public cl
  • jQuery 日期选择器动态设置所选日期

    如何动态更改 jquery 日期选择器的选定日期 我说过创建了一个内联日期选择器 然后过了一段时间 我想在那里反映不同的日期 而无需从头开始重新创建日期选择器 我尝试了setDate方法 但没有用 并且文档中没有太多文档doc 还有另一个
  • Flask 会话不会在 heroku 上持久存在

    当用户登录到我的示例应用程序时 我将用户名密钥添加到会话对象中 并将用户对象挂在全局 g 对象之外 见下文 app route login methods GET POST def login Logs the user in error
  • 逃避大括号的简单方法?

    有没有一种简单的方法可以用 Handlebars 构建字符串 value 也许类似于 Handlebars compile var var value 车把支持空白 特点 以下应该有效 Handlebars compile var var
  • 在 Grails 中,如何指定 ivy 解析器所需的 jar?

    在 grails 项目中 我根据参考文档添加了一个自定义 ivy 解析器 http www grails org doc latest guide single html 12 2 20 插件 20 存储库 然而 这个解析器需要 jsch
  • Swift 中的 HTTP 请求与 swift3 中的 POST 方法

    我正在尝试在 Swift3 中运行 HTTP 请求 将 2 个参数 POST 到 URL Example Link http test tranzporthub com street45 customer login php Params
  • JavaFX - BorderPane/StackPane 在子项更改后未调整大小

    从 JavaFX BorderPane 添加和删除内容时 我遇到调整大小问题 在手动调整窗口大小之前 不会调整 BorderPane 内容的大小 我编写了一个小型测试应用程序来模拟这种行为 该应用程序构建了一个 BorderPane 其中包
  • 无法将Redis服务器连接到nodejs,Docker compose

    我正在努力将 Redis 部署连接到我的 Nodejs 应用程序 当然 在本地不使用 docker 它工作得很好 所以我对这是否与我的代码有关 或者我设置 docker compose 文件的方式有争议 Dockerfile FROM no
  • 日期时间(微秒)

    微秒的日期时间值是否会以精确的精度转换为双精度 例如 我的日期是2017 年 7 月 3 日 10 00 00 00 刻度 636346728000000050 正如我所得到的那样 它转换为双倍42919 4166666667 同样 我已将
  • 如何获得 Spinner 的选定值?

    我正在尝试从 a 中获取选定的项目字符串Spinner 到目前为止我已经得到了这个 bundle putString ListDbAdapter DB PRI v getText toString 这不起作用并给出一个类转换异常 我想我可以
  • 在 xcode/ios 中以编程方式编辑 RTF/DOC 文件

    我有一个可以在 iPhone 上查看的 RTF 文件 现在我需要以编程方式编辑该文件 请告诉我该怎么做 例子 RTF文件内容 我是 StackOverflow 的新手 现在我需要以编程方式更改为以下行 我经常访问 StackOverflow
  • 在 Linux 中查找包的二进制文件

    我正在完成一个包 但是我似乎没有找到一种方法使包在系统中找到二进制文件 请注意下面的代码 find nim lt function message TRUE nimexe lt if Platform OS type unix nimexe
  • Laravel 中 Count 为零时如何获取记录

    我使用 Chart js 来显示每个月的预订数量 这是我的查询 它运行良好 我的问题是 如果一个月内没有预订 那么它不会显示任何内容 没有零值 在图表上我得到的值如下 1月23日 2月34日 4月23日 May 25 July 42 图表上
  • Pyspark 中的 JSON 文件解析

    我对 Pyspark 很陌生 我尝试使用以下代码解析 JSON 文件 from pyspark sql import SQLContext sqlContext SQLContext sc df sqlContext read json f
  • 网站图标在 IE 中不工作

    我有一个使用自定义 favicon ico 的网站 图标在除 IE 之外的所有浏览器中按预期显示 当尝试在 IE 中显示图标时 我得到大红色 x 当在另一个浏览器中显示图标时 它显示得很好 页面源码包括 它确实可以在其他浏览器中工作 谢谢你
  • jQuery + MarkItUp + Polymer - 让它发挥作用吗?

    Using Polymer 我正在尝试创建一个可重用的组件markItUp这样我就可以在需要时使用富文本编辑器 但是 尽我所能 我无法让它正确初始化 jQuery 选择器根本无法找到 textarea 元素来发挥其魔力 我已经尝试了很多添加
  • 子表中的外键约束允许插入父表中不存在的值

    我正在使用 SQL Server 2012 我已经在表上定义了外键约束 外键引用复合主键 当一列具有 00000 而另一列为空时 fk 约束不起作用 父表不包含 00000 两个 fk 列都有varchar数据类型 下面是示例 INSERT