Questions tagged «referential-integrity»

数据库管理系统提供的功能,可确保数据内的一致性。



3
对数组成员的外键约束?
假设我有一个包含工作角色的表: CREATE TABLE roles ( "role" character varying(80) NOT NULL, CONSTRAINT "role" PRIMARY KEY (role) ); 假设我还有一个表,用户,并且每一行(一个特定的用户)可以具有任意数量的作业角色: CREATE TABLE users ( username character varying(12) NOT NULL, roles character varying(80)[] NOT NULL, CONSTRAINT username PRIMARY KEY (username) ); 我可能应该确保的每个成员都users.roles[]存在于role.role中。在我看来,我想要的是对每个成员的外键约束,users.roles[]例如,如果引用role.role。 对于postgres,这似乎是不可能的。我看错了方向吗?建议的“正确”处理方式是什么?

3
在数据库中强制执行“至少一个”或“完全一个”的约束
假设我们有用户,每个用户可以有多个电子邮件地址 CREATE TABLE emails ( user_id integer, email_address text, is_active boolean ) 一些样本行 user_id | email_address | is_active 1 | foo@bar.com | t 1 | baz@bar.com | f 1 | bar@foo.com | f 2 | ccc@ddd.com | t 我要强制执行一个约束,即每个用户都只有一个活动地址。如何在Postgres中做到这一点?我可以这样做: CREATE UNIQUE INDEX "user_email" ON emails(user_id) WHERE is_active=true; 这样做可以防止用户拥有多个活动地址,但我相信不能防止其所有地址都设置为false。 如果可能的话,我宁愿避免使用触发器或pl / …

5
是否有DBMS允许外键引用视图(而不仅仅是基表)?
受到Django建模问题的启发:Django中具有多个多对多关系的数据库建模。数据库设计类似于: CREATE TABLE Book ( BookID INT NOT NULL , BookTitle VARCHAR(200) NOT NULL , PRIMARY KEY (BookID) ) ; CREATE TABLE Tag ( TagID INT NOT NULL , TagName VARCHAR(50) NOT NULL , PRIMARY KEY (TagID) ) ; CREATE TABLE BookTag ( BookID INT NOT NULL , TagID INT …

2
多对多和弱实体
我有一个不能被另一个定义的实体,并且我希望这个实体参与多对多关系。 示例:一个艺术家有一个专辑(没有艺术家就不能存在该专辑),该专辑也有许多曲目,但是同一首曲目可以存在于许多专辑中。 因此,专辑和曲目之间存在多对多的关系。 如果专辑是一个弱实体,则它的主键是引用艺术家的外键,因此它不能是代表多对多关系的另一个表的外键。 问题是:在SQL中是否可能有这种关系,如果是这样,我该如何表达呢?

2
约束-一个布尔行为true,所有其他行为false
我有一列: standard BOOLEAN NOT NULL 我想强制执行True,其余所有都设置为False。根据此约束,没有FK或其他任何内容。我知道我可以用plpgsql完成它,但这似乎像是一把大锤。我更喜欢a CHECK或UNIQUE约束。越简单越好。 一行必须为True,不能全部为False(因此,插入的第一行必须为True)。 该行将需要更新,这意味着我必须等待检查约束,直到更新完成,因为所有行都可能先设置为False,然后再设置为True。 products.tax_rate_id和之间有一个FK tax_rate.id,但与默认税率或标准税率无关,用户可以选择默认税率或标准税率来轻松创建新产品。 PostgreSQL 9.5(如果重要)。 背景 该表是税率。税率之一是默认税率(standard因为默认税率是Postgres命令)。添加新产品时,将对产品应用标准税率。如果没有standard,则数据库必须进行猜测或进行各种不必要的检查。我认为,简单的解决方案是确保存在standard。 上面的“默认”是指表示层(UI)。有一个用于更改默认税率的用户选项。我或者需要添加额外的检查以确保GUI /用户不会尝试将tax_rate_id设置为NULL,或者只是设置默认税率。

3
级联主键更新为所有引用的外键
是否可以通过在引用该引用的所有外键之间级联更新来更新主键列值? #编辑1: 当我运行followinq查询 select * from sys.foreign_keys where referenced_object_id=OBJECT_ID('myTable') ,我看到update_referential_action设置为0。因此,在更新主键列之后不执行任何操作。如何更新外键以使其成为CASCADE UPDATE? #编辑2: 为了脚本化脚本中所有外键的创建或删除,请运行以下脚本(从此处获取) DECLARE @schema_name sysname; DECLARE @table_name sysname; DECLARE @constraint_name sysname; DECLARE @constraint_object_id int; DECLARE @referenced_object_name sysname; DECLARE @is_disabled bit; DECLARE @is_not_for_replication bit; DECLARE @is_not_trusted bit; DECLARE @delete_referential_action tinyint; DECLARE @update_referential_action tinyint; DECLARE @tsql nvarchar(4000); DECLARE @tsql2 nvarchar(4000); DECLARE …

4
DELETE语句与REFERENCE约束冲突
我的情况如下所示: 表STOCK_ARTICLES: ID *[PK]* OTHER_DB_ID ITEM_NAME 表格位置: ID *[PK]* LOCATION_NAME 表WORK_PLACE: ID *[PK]* WORKPLACE_NAME 表INVENTORY_ITEMS: ID *[PK]* ITEM_NAME STOCK_ARTICLE *[FK]* LOCATION *[FK]* WORK_PLACE *[FK]* 显然,INVENTORY_ITEMS中的3个FK引用了其他表中的“ ID”列。 此处的相关表是STOCK_ARTICLE和INVENTORY_ITEMS。 现在有一个SQL作业,包含几个步骤(SQL脚本),这些步骤将上述数据库与另一个数据库(OTHER_DB)“同步” 。此作业中的步骤之一是“清理”。它会从STOCK_ITEMS中删除所有记录,而另一个数据库中没有对应的具有相同ID的记录。看起来像这样: DELETE FROM STOCK_ARTICLES WHERE NOT EXISTS (SELECT OTHER_DB_ID FROM [OTHER_DB].[dbo].[OtherTable] AS other WHERE other.ObjectID = STOCK_ARTICLES.OTHER_DB_ID) 但是此步骤始终失败: DELETE语句与REFERENCE约束“ FK_INVENTORY_ITEMS_STOCK_ARTICLES”冲突。数据库“ FIRST_DB”的表“ dbo.INVENTORY_ITEMS”的列“ …

1
加强约束“两张桌子”
我在用SQL建模电气原理图时遇到了一些麻烦。我想捕捉的结构是 part ←────────── pin ↑ ↑ part_inst ←───── pin_inst 其中“实例”是“实例”的缩写。 例如,作为partLM358运算放大器,我可能具有pins 1OUT,1IN-,1IN +,GND,2IN +,2IN-,2OUT和V CC。然后,我可能将此零件放在原理图上,并创建一个part_inst和8 pin_insts。 忽略数据字段,我最初对模式的尝试是 create table parts ( part_id bigserial primary key ); create table pins ( pin_id bigserial primary key, part_id bigint not null references parts ); create table part_insts ( part_inst_id bigserial primary key, part_id …

2
此“映射”表是否需要单独的Id列?
我有Producers和的表Products,两者的形式均为: Id -int,主键 Name -nvarchar 一个生产者可以携带多个产品,所以我要创建一个表ProducerDetails,该表将具有: ProducerId -int,外键 Producers.Id ProductId -int,外键 Products.Id 然后我开始质疑自己,所以我想问专家。Id在ProducerDetails表中增加一个附加列(int,主键)会更好吗?还是那是不必要的? 如果这有任何区别,我正在使用SQL-Server 2008 R2。 编辑 -我相信这些表之间的关系将是多对多的,抱歉,我没有说清楚。一个生产者可以携带多种类型的产品,并且同一产品可以由多个不同的生产者生产。 如果这个问题过于简单,我很抱歉,参照完整性/数据库设计不是我的强项(尽管我正在努力改善这一点)。

2
在单独的数据库之间建立关系是不好的做法吗?
我正在与一个具有多个数据库的客户端一起工作。有多个master级别数据库,这些级别数据库具有从instance级别数据库(特定于应用程序的DB)返回的关系。从instance到的关系master是整数值,代表.NET中表的主键master。设置中的视图和存储过程以通过这些存储的键instances从中加载数据master。 显然,没有真正的参照完整性,但是这是一种不好的做法还是应该将数据驻留在instance数据库的只读表中?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.