问题标签 [referential-integrity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
125764 浏览

sql - 使用空列创建唯一约束

我有一张这样布局的桌子:

我想创建一个类似于此的唯一约束:

但是,这将允许多行具有相同的(UserId, RecipeId), if MenuId IS NULL。我想允许存储一个没有关联菜单的收藏夹,但我只想要每个用户/食谱对最多这些行中的一个NULLMenuId

到目前为止,我的想法是:

  1. 使用一些硬编码的 UUID(例如全零)而不是 null。
    但是,MenuId每个用户的菜单都有 FK 约束,所以我必须为每个用户创建一个特殊的“空”菜单,这很麻烦。

  2. 改为使用触发器检查是否存在空条目。
    我认为这很麻烦,我喜欢尽可能避免触发。另外,我不相信他们能保证我的数据永远不会处于不良状态。

  3. 忘记它并检查中间件或插入函数中先前是否存在空条目,并且没有此约束。

我正在使用 Postgres 9.0。

有什么我忽略的方法吗?

0 投票
2 回答
2610 浏览

postgresql - 在继承的表上使用触发器来替换外键

我是 PostgreSQL 新手。我有这样的表:

根据这些表,当我想将数据插入Adress表中时,Postgres 会给出该错误:

错误:在表“address”上插入或更新违反了外键约束“address_person_id_fkey” 详细信息:表“person”中不存在键 (person_id)=(1)。

我在 Postgres 中学到了这一点

索引(包括唯一约束)和外键约束仅适用于单个表,而不适用于它们的继承子表。

我的问题是如何使用触发器来解决这个问题?示例代码将非常有用。

在子表中插入几行后,我可以看到带有 'SELECT * FROM Person;' 的数据 也是。看起来像:

人表

学生桌

员工表

0 投票
1 回答
2727 浏览

ms-access - 访问:对链接表施加参照完整性

我有两个 Access 数据库:Main存储我的大部分数据和Memos存储数据类型 Memo 的数据。我将备忘录存储在单独的数据库中,因为我读到的有关备忘录字段的所有内容都表示它们容易损坏,并且保护数据库的唯一安全方法是将备忘录放在单独的链接数据库中。

Memos有一个Info包含字段的表:( ID类型自动编号主键) Info(类型备忘录)

Main有一个Content包含字段的表:( ID类型自动编号主键) infoID(类型数字) entryDate(类型日期/时间)

我想强制执行参照完整性,Content以便它只能接受来自 table 的有效 ID 值Info。但我不能,因为Memos是链接数据库。我可以在数据输入过程的另一点建立控件,以确保只有来自的值Info可以插入到Content中,但如果有办法通过数据库约束强制执行验证,我宁愿不编写验证代码。

是否有另一种方法可以在我不知道的链接表之间强制执行完整性,或者有另一种方法来处理备忘录存储问题,以便我可以将备忘录保存在同一个数据库中?

0 投票
1 回答
2520 浏览

oracle - Oracle - 具有多种类型数据的参照完整性

我正在处理 Oracle 中的一组数据库表,并试图找出一种方法来使用稍微多态的数据来强制引用完整性。

具体来说,我有一堆不同的桌子——假设我有苹果、香蕉、橙子、橘子、葡萄和一百多种水果。现在我正在尝试制作一张表格,描述涉及水果的执行步骤。所以我想插入一行写着“吃 Apple ID 100”,然后插入另一行写着“剥香蕉 ID 250”,然后插入另一行写着“冷藏 Tangerine ID 500”,依此类推。

从历史上看,我们通过两种方式做到了这一点:

1 - 为每种可能的水果类型添加一列。使用检查约束来确保除一列之外的所有列都是 NULL。使用外键来确保我们的水果的引用完整性。因此,在我的假设示例中,我们将有一个包含 columnsACTION, APPLEID, BANANAID, ORANGEID, TANGERINEID和的表GRAPEID。对于第一个动作,我们有一个 row 'Eat', 100, NULL, NULL, NULL, NULL, NULL。对于第二个动作,我们有'Peel', NULL, 250, NULL, NULL, NULL. 等等等等

这种方法非常适合自动获得 Oracle 的所有 RI 优势,但它不能扩展到一百种水果。你最终会得到太多的列而不实用。仅仅弄清楚你要处理的是哪种水果就成了一个挑战。

2 - 包括一个带有水果名称的列和一个带有水果 ID 的列。这也有效,但没有任何方法(AFAIK)让 Oracle 以任何方式强制数据的有效性。所以我们的列将是ACTION, FRUITTYPE, 和FRUITID。行数据将是'Eat', 'Apple', 100, then'Peel', 'Banana', 250等。但是没有什么可以阻止某人删除 Apple ID 100,或者插入一个步骤说'Eat', 'Apple', 90000000即使我们没有具有该 ID 的 Apple。

有没有办法避免为每个单独的水果类型维护一个单独的列,但仍然保留外键的大部分好处?(或者从技术上讲,如果我能以某种巧妙的技巧隐藏复杂性,我可能会被说服使用一百列。它只需要在日常使用中看起来很正常。)

澄清:在我们的实际逻辑中,“水果”是完全不同的表,几乎没有共同点。想想客户、员工、会议、房间、建筑物、资产标签等。步骤列表应该是自由格式的,并允许用户指定对任何这些事物的操作。如果我们有一张包含这些不相关的东西的桌子,我不会有问题,但这也是一个非常奇怪的设计。

0 投票
3 回答
276 浏览

php - 除了作为“哑”数据存储之外,将 MySQL 用于任何其他用途有什么好处吗?

我问的原因是我们想使用 MySQL 目前不支持的某个 CHECK 约束。如果没有这种类型的约束,使用外键和引用完整性的全部原因似乎会随着应用程序代码承担更多的数据库责任而减少。

如果我们要创建一个“哑”数据模型并将所有引用完整性检查移动到应用程序代码中的一个层,那么潜在的测试可能会更简单,因为引用完整性错误将被捕获在应用程序而不是数据库中。它还可以潜在地加速新模块的开发,因为它们在测试之前不一定必须是引用完整的(这是一个术语吗?)。

那么,在 MySQL 中坚持使用“正确”数据模型并保留外键和“ON UPDATE CASCADE”语句等还有其他好处吗?

或者,我们应该抛弃 MySQL 并转向别的东西吗?!

谢谢!

0 投票
1 回答
862 浏览

sql-server - SQL Server - 在没有 CASCADE 和 INSTEAD OF 触发器的情况下保持参照完整性

我有一个与父表(TableA)有外键关系的表(TableB)。

当我删除表 A 中的记录时,我想通过删除表 B 中引用表 A 中已删除记录的所有记录来保持引用完整性。

通常我会删除级联。但是,由于 SQL Server 中的表结构和针对多个级联路径的过度保护措施,对于这种特定关系来说这是不可能的。

我也不能使用 INSTEAD OF 触发器,因为 TableA 本身具有 CASCADE 外键关系。

我正在考虑将 TableA 和 TableB 之间的关系更改为 ON DELETE SET NULL,然后创建一个 AFTER 触发器来清理 TableB 中的 NULL 记录。

有没有更好的方法来处理这种情况?

0 投票
3 回答
184 浏览

sql - 维护移动客户端和服务器之间的引用完整性

所以我有一个相对简单的系统。移动客户端在我希望同步到远程 SQL 服务器(与其他移动客户端共享)的 sqlite 数据库中创建记录。因此,当我在手机的 sqlite 表中创建新记录时,我会通过 RESTful API 将该更改推送到我的远程服务。我遇到的问题是如何对主键进行排序,以免数据发生冲突(即电话中的记录与服务器上完全不同的记录具有相同的主键)。在客户端引用记录和在服务器上引用相同记录的通常“最佳实践”是什么?

0 投票
1 回答
10868 浏览

sql - postgresql 和 Delete 语句违反外键约束

我的删除语句有问题。

我有两张桌子:

当我vehicule从表中删除 a 时,vehicule_loan我希望vehicule_uid保留表中的引用行。

但是当我尝试删除一个时,我得到了这个错误:

我想我理解错误:vehicule从 table中删除 a 后vehicule_loanvehiculeinvehicule_uid将指向任何内容。

但是有没有办法保留行vehicule_uid

0 投票
2 回答
182 浏览

sql-server - SQL Server 删除困境

鉴于上述情况,任何一个表中的记录都不能被删除 - 有什么巧妙的解决方案吗?我想做的是对设计进行排序,使链接表成为一个纯粹的链接表,而不是让它本身携带价值。到目前为止,这还不是问题,因为从不需要实际删除行(它们被标记,但没有实际删除),当然您可以插入,因为 DefaultValue 可以为 NULL。

编辑:作为对我的降级的回应,我应该提到,我已经考虑过 ON DELETE CASCADE 和 TRIGGER,我正在寻找这些场景的替代方案,显然 ON DELETE SET NULL 将不起作用。

0 投票
2 回答
7263 浏览

database-design - 外键与完整性检查约束

我正在构建一个系统,它是一个中央存储库,用于存储来自许多其他系统的数据。当其他系统数据更新时,需要同步过程来更新中央存储库。将有一个 sync_action 表来标识中央存储库需要与哪个系统同步以及所需的同步类型。有一组定义的操作不太可能改变。下面是一个精简的系统。

正如我所看到的,我可以通过两种方式解决这个问题:

选项 1 ) 有一个Action表,其中包含 3 个可用的操作。有一个sync_action使用外键引用所需操作的表。

表:系统

表:行动

表:Sync_action

选项 2)而不是外键使用sync_action.action列上的检查约束,因此只能Insert/Update/Delete插入操作。

表:Sync_action

我想知道在决定完整性约束、外键与检查约束之间时,哪些因素会决定哪种方法更好。有类似的线程,但我没有发现它们足够明确。这可能是因为它取决于解释,但任何想法都会受到赞赏。

干杯