Questions tagged «foreign-key»

在RDBMS平台中使用的一种完整性约束,用于确保列中的值与另一个表中的键值范围之一匹配。

2
如果操作是由带有UPDATE CASCADE的FK约束引起的,则FOR EACH STATEMENT触发器多久执行一次?
我了解FOR EACH STATEMENT在执行时,表t上定义的触发器将运行一次UPDATE t ...。 现在,当使用t定义时FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE,我更新的N行a,这会导致触发器被调用一次或N次吗? 换句话说,由FK约束级联的表更改更像是单个UPDATE,还是更像一系列UPDATEs?

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 …

2
我应该添加传递式外键吗?
一个简单的例子:有一张客户表。 create table Customers ( id integer, constraint CustomersPK primary key (id) ) 数据库中的所有其他数据都应链接到Customer,因此例如Orders: create table Orders ( id integer, customer integer, constraint OrdersPK primary key (customer, id), constraint OrdersFKCustomers foreign key (customer) references Customers (id) ) 假设现在有一个表链接到Orders: create table Items ( id integer, customer integer, order integer, constraint ItemsPK …

1
如何关联同一表中的两行
我有一个表,行可以相互关联,从逻辑上讲,两行之间的关系是双向的(基本上是无方向的)。(并且,如果您想知道,是的,这确实应该是一张表。这是逻辑实体/类型完全相同的两件事。)我可以想到几种方法来表示: 存储关系及其反向 以一种方式存储关系,以另一种方式限制数据库存储,并具有两个索引,它们的FK顺序相反(一个索引是PK索引) 以两种方式以一种方式存储关系,并允许以任何方式插入第二种方式(听起来有点讨厌,但是完整性) 创建某种分组表,并在原始表上添加一个FK。(提出了很多问题。分组表只能有一个数字;为什么还要有该表?使FK为NULL还是将具有单行的组关联起来?) 这些方式的主要利弊是什么,当然,有什么我没想到的方式吗? 这是一个可使用的SQLFiddle:http ://sqlfiddle.com/#!12/7ee1a/1/0 。(由于这是我正在使用的,所以它是PostgreSQL,但我认为这个问题不是非常特定于PostgreSQL的。)作为示例,它当前存储了关系及其反向关系。


4
如何将具有外键约束的列添加到已存在的表中?
我有下表 CREATE TABLE users (id int PRIMARY KEY); -- already exists with data CREATE TABLE message (); 我该如何更改messages表格, 一个名为的新列sender被添加到其中 sender引用该users表的外键在哪里 这没用 # ALTER TABLE message ADD FOREIGN KEY (sender) REFERENCES users; ERROR: column "sender" referenced in foreign key constraint does not exist 此语句是否也不会创建该列?

2
如何在MySQL中对外键使用RESTRICT?
在数据库结构中 CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

3
在SQL中实现一对零或一个关系
让我们说,我正在为存在一对零或一个(1-0..1)关系的场景设计数据库。例如: 有一组用户,有些 用户也可能是客户。 因此,我创建了两个对应的表,users和customers,但是…… …在给定的SQL平台上表示和实现这种情况的最佳方法是什么?我考虑了两种可能的解决方案: 在users表中,添加customer可能是FOREIGN KEY引用customers或NULL标记的列。 在customers表格中,包括指向表格的user列(设置了UNIQUE约束)users。 我已经在一些论坛中提出过类似的问题,但是答案基本上是“无论您需要什么”,“无论您认为方便什么”。我不喜欢这种答案。我想要一个严肃的DB理论,一个有充分根据的答案。我在哪里可以阅读有关1-0..1关系的信息?

1
批量插入后,外键变得不受信任
在具有2012兼容模式下数据库的SQL 2014版服务器(12.0.2430.0-尚无SP1)中(正在努力将其切换到2014 ...),我有少数几个外键对象,这些外键对象not trusted在数据库中始终标记为。我删除并重新创建了没有NOCHECK选项的它们,但是在5到10分钟内,它们再次变得不受信任,如果我生成CREATE脚本,它将显示为: ALTER TABLE [dbo].[Points] WITH NOCHECK ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO 使用的创建脚本为: ALTER TABLE [dbo].[Points] ADD CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId]) REFERENCES [dbo].[Badge] ([Id]) GO ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId] GO 没有复制,没有第三方工具,而且我正在监视数据库中的所有DDL语句,因此它不是另一个用户。 我能够很好地检查约束(WITH CHECK CHECK在每个约束上使用),但是不久之后它们仍然变得不受信任。只有运行的维护工作是Ola在AM的早期工作,并且整天都在进行。 更新: 因此,在经过几次跟踪以缩小可能性后,似乎BULK INSERT可能导致FK变得不可信。这个msdn问题指出,这是密钥变得不受信任的有效途径,这是我第一次听说。 所以我现在的问题是,有没有一种替代方法BULK INSERT可以保持外键is_trusted状态?它是在每小时运行几次的应用程序的上下文中执行的。我可以让开发人员批处理其插入语句,但是BULK INSERT如果不需要的话,我不希望在使用时使用最后通atum 。

5
在SQL Server的同一列上使用多个外键
SQL Server允许我在列上创建多个外键,并且每次使用不同的名称时,我都可以创建另一个引用同一对象的键。基本上所有键都定义相同的关系。我想知道在同一列中定义多个外键并引用另一个表中的同一列的用途。SQL Server允许我们做这样的事情有什么好处?

2
为什么复合外键需要单独的唯一约束?
这是一个简单的表,其中的记录可以引用同一表中的父记录: CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); 在附加要求下,num父记录和子记录之间的其他字段值之一必须相同,我认为应该使用复合外键来解决问题。我将最后一行更改为 FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) 并得到错误:没有唯一的约束条件匹配给定表“ foo”的键。 我可以轻松添加此约束,但是当所引用的列(id)中的一个已被保证是唯一的时,我不明白为什么有必要这样做?从我的角度来看,新约束将是多余的。

1
如何在Amazon RDS PostgreSQL中临时禁用外键?
我正在将现有测试环境迁移到Amazon RDS PostgreSQL。测试框架具有将某些表中的数据重新加载到较早状态的功能。为此,它将禁用外键,删除现有数据,加载保存状态并再次启用外键。 当前,测试框架通过禁用所有触发器来禁用外键(当然,这需要超级用户): alter table tablename disable trigger all; 在RDS上,此操作失败并显示: 错误:权限被拒绝:“ RI_ConstraintTrigger_a_20164”是系统触发器 如何在Amazon RDS PostgreSQL中临时禁用外键? 注意:已经问过类似的问题(RDS上的PostgreSQL:如何在FK约束下批量导入数据?),但这是专门针对脱机导入的,解决方案也针对脱机导入。

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 …

3
如何检索外键约束数据
我正在寻找一个查询,该查询允许检索整个架构的外键信息(每行:引用表和字段,引用表和字段)。 我已经找到了,但是没有提供我需要的所有信息:https : //stackoverflow.com/questions/4389228/sql-for-oracle-to-check-if-a-constraint-exists 我目前正在研究它,可能在接下来的几分钟/几小时内得到解决方案。但是,如果有人已经有了完整的工作解决方案,我将很高兴知道:)

2
视图是否需要自己的外键约束?
免责声明:我是程序员,而不是DBA,所以请耐心等待... 我有一种观点,我只是将2个实体映射在一起。我必须在几个不同的表之间进行联接才能得到: CREATE OR REPLACE VIEW V_SCREENING_GROUP_SITES AS ( SELECT SG.SCREENING_GROUP_ID, V.SITE_ID FROM SCREENING_GROUP SG, VISIT V, VISIT_DATE VD WHERE VD.VISIT_ID = V.VISIT_ID AND V.SCREENING_GROUP_ID = SG.SCREENING_GROUP_ID); 以上仅是上下文,请不要为此担心太多。我需要知道的是如何使新的V_SCREENING_GROUP_SITES视图中的字段(SCREENING_GROUP_ID和SITE_ID)充当SCREENING_GROUP和SITE表的外键。还是有关系吗? 如果是一张桌子,我会做: ALTER TABLE V_SCREENING_GROUP_SITES ADD CONSTRAINT FK_SCREENING_GROUP_ID FOREIGN KEY (SCREENING_GROUP_ID) REFERENCES SCREENING_GROUP.SCREENING_GROUP_ID; ... 但是,由于这种观点显然行不通。我找不到可用于设置FK的ALTER VIEW语法。我该怎么办? (这是一个MySQL数据库)

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.