Questions tagged «foreign-key»

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

2
查找与给定主键关联的外键
我想要一种通过PK / FK关系建立给定数据库中的哪些列的方法。我可以通过以下方式返回给定表的PK / FK信息 SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS cu WHERE EXISTS ( SELECT tc.* FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc WHERE tc.CONSTRAINT_CATALOG = 'MyDatabase' AND tc.TABLE_NAME = 'MyTable' /*AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'*/ AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME); GO 但是对于从这样的查询返回的PK,我如何建立关联的FK(假设有一个)? 我知道您也可以通过以下方式获取引用的表: SELECT CONSTRAINT_NAME = name, FOREIGN_SCHEMA = OBJECT_SCHEMA_NAME(parent_object_id), FOREIGN_TABLE = OBJECT_NAME(parent_object_id), …

3
集群列存储索引和外键
我正在使用索引对数据仓库进行性能优化。我对SQL Server 2014相当陌生,Microsoft描述了以下内容: “我们将群集列存储索引视为存储大型数据仓库事实表的标准,并期望在大多数数据仓库场景中使用该索引。由于群集列存储索引是可更新的,因此您的工作负载可以执行大量的插入,更新,和删除操作。” http://msdn.microsoft.com/en-us/library/gg492088.aspx 但是,如果您进一步阅读文档,则会发现存在以下限制和限制: “不能具有唯一性约束,主键约束或外键约束。” 这让我很困惑!出于各种原因(数据完整性,语义层可见的关系...),在数据仓库中具有外键是一种很好的做法(不是强制性的) 因此,Microsoft提倡针对数据仓库方案使用集群列存储索引。但是,它不能处理外键关系?! 我对此是否正确?您还建议其他哪些方法?过去,我在数据仓库场景中使用了非集群列存储索引,并为数据负载进行了删除和重建。但是,SQL Server 2014然后没有为数据仓库添加任何真正的新价值?


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

1
在使用pg_restore.exe之前禁用约束
当我尝试pg_restore.exe从数据库执行转储文件时,它会引发数十个错误,所有错误均相同: ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName" 这显然是由于我在从转储文件(该文件来自生产数据库)还原数据库之前清空了数据库的事实...当然,如果一个引用表为空,则没有外键约束可以... 在我调用之前pg_restore.exe和之后,有没有一种方法可以针对所有表禁用约束和所有外键,然后重新启用约束和外键。 在SO中,我发现了一些有趣的东西:将约束检查推迟到提交时间。但是我认为在推迟约束之后我不能pg_restore.exe从内部打电话psql.exe。 也有这篇帖子,可以追溯到10年前,建议删除然后重新添加约束。或将pg_class重新触发的值更改为0,这对于约束也可能是可行的...但是,恐怕它比好的实践更容易被黑客入侵... 您有什么建议,这种情况下的最佳做法是什么?是否pg_dump.exe 与该-clean标志一起使用会创建一个转储,从而在还原数据库时绕过约束检查?

4
递归自我联接
我有一张comments桌子,可以简化为: comments ======= id user_id text parent_id where parent_id可为空,但可能是其父注释的键。 现在,我该如何select评论所有后代? 评论可能会降低几个级别...


2
有关关系数据库中的查找表的最佳实践是什么?
查找表(或某些人称为代码表)通常是可以为特定列提供的可能值的集合。 例如,假设我们有一个查找表party(用于存储有关政党的信息),该表具有两列: party_code_idn,其中包含系统生成的数值,并且(缺少业务域的含义)可以用作实键的替代。 party_code是表的实键或“自然”键,因为它维护具有业务域内涵的值。 让我们说这样的表保留了以下数据: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ 在party_code列,这使价值“共和”和“民主”,在工作台的真正的关键,是建立了一个独特的约束,但我需要添加的party_code_idn,它定义为表(的PK虽然,从逻辑上说,party_code可以用作主键[PK])。 题 指向事务表中的查找值的最佳实践是什么?我是否应该建立外键(FK)引用(a)直接指向自然和有意义的值,或者(b)替代值? 例如,选项(a), +---------------+------------+---------+ | candidate_idn | party_code | city | +---------------+------------+---------+ | 1 | Democratic | Alaska | | 2 | Republican | Memphis | …

2
条件外键关系
我目前在两个实体之间有一个外键,我想使该关系以表之一的entityType为条件。这是表格的层次结构,这是通过FK从孩子到父母的折算完成的 Store / \ Employees \ TransactionalStores / | \ Kiosks | BrickMortars Onlines 我目前有从员工到商店的FK关系 ALTER TABLE Employees ADD CONSTRAINT Employee_Store FOREIGN KEY (TransStoreId) REFERENCES TransactionalStores(StoreId) 我想添加条件: WHERE TransactionalStores.storeType != 'ONLINE_TYPE' 这是否可能,或者我必须将TransactionalStores分为两个新的子类型(例如PhysicalStores和VirtualStores)

3
外键-使用代理键还是自然键链接?
对于表之间的外键应该链接到自然键还是代理键,是否存在最佳实践?我真正发现的唯一讨论(除非缺少我的google-fu)是杰克·道格拉斯在这个问题上的答案,他的推理对我来说似乎很合理。我知道有关规则会发生变化的讨论之外,但是在任何情况下都需要考虑这一点。 提出这个问题的主要原因是,我有一个使用带有自然键的FK的遗留应用程序,但是开发者大力推动将其移至OR / M(在我们的例子中为NHibernate),并且一个fork已经产生了一些东西。中断更改,因此我希望使用自然键将它们推回正轨,或者移动旧版应用程序以使用FK的替代键。我的直觉说要恢复原始的FK,但是老实说,我不确定这是否是正确的选择。 我们的大多数表都已经定义了代理键和自然键(尽管有唯一约束和PK),因此在这种情况下,不必添加额外的列对我们来说不是问题。我们正在使用SQL Server 2008,但是我希望这对于任何数据库都足够通用。

2
为什么丢弃外键要花很长时间?
我制作了一个脚本,可以一次删除一个数据库中的所有外键,就像这样: ALTER TABLE MyTable1 DROP CONSTRAINT FK_MyTable1_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col1 ALTER TABLE MyTable2 DROP CONSTRAINT FK_MyTable2_col2 令我惊讶的是,该脚本花费的时间很长:每个DROP FK平均需要20秒。现在,我知道创建FK可能是一件大事,因为服务器必须去检查FK约束是否从一开始就没有受到侵犯,而是放弃了?服务器删除需要很长时间的FK时会做什么?这既出于我自己的好奇心,又是为了了解是否有一种使事情更快的方法。能够删除FK(而不仅仅是禁用它们)可以使我在迁移过程中更快,从而最大程度地减少停机时间。

5
对于大型应用程序,在同一个数据库的不同模式的表上创建外键是个坏主意吗?
我正在将基于pl / sql网络的大型应用程序传输到专用服务器。此应用程序位于具有70个程序包代码的模式中。在不同的时间大约有15个人进行了此应用程序。对我们来说,通常的做法是在不同模式的引用表上创建外键,因为它确实很方便并且可以使数据库保持整洁,因为我们不需要在不同的模式中保留相同的引用表。 但是无论如何,我的DBA(使用DB创建新实例并在Solaris区域内复制我的应用程序)今天非常苛刻,“不同模式上的外键是邪恶的,您需要销毁它!”。他没有解释他的观点。 在大型应用程序上这样做真的是个坏主意吗?

2
MySQL-删除具有外键约束且引用自身的行
我有一个表,用于存储用户在我的网站上发布的所有论坛消息。消息层次结构是使用嵌套集模型实现的。 以下是该表的简化结构: ID(主键) Owner_Id(对ID的外国主要参考) Parent_Id(对ID的外国主要参考) 左 好吧 级别 现在,表格看起来像这样: + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | Id | Owner_Id | Parent_Id | nleft | nright | nlevel | + ------- + ------------- + -------------- + ---------- + ----------- + ----------- + | 1 …

2
PostgreSQL-插入/更新违反外键约束
我是postgreSQL的新手。我有3个表,一个表引用了其他2个表的主键。但是我无法将数据插入Table3。参见下面的代码: DROP TABLE Table1 CASCADE; CREATE TABLE Table1( "DataID" bigint NOT NULL DEFAULT '0', "AdData" integer DEFAULT NULL, PRIMARY KEY ("DataID") ); DROP TABLE IF EXISTS Table2 CASCADE; CREATE TABLE Table2 ( "Address" numeric(20) NOT NULL DEFAULT '0', "Value" numeric(20) DEFAULT NULL, PRIMARY KEY ("Address") ); DROP TABLE IF EXISTS …


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.