Questions tagged «foreign-key»

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

5
级联(ON DELETE / UPDATE)行为的良好解释
我不是每天都设计架构,但是当我这样做时,我会尝试正确设置级联更新/删除以简化管理。我了解级联的工作方式,但是我不记得哪个表是哪个表。 例如,如果我有两个表- Parent和Child-在Child该引用上具有外键Parent并具有ON DELETE CASCADE,则哪些记录触发级联,而哪些记录被级联删除?我的第一个猜测是Child删除Parent记录后记录会被删除,因为Child记录取决于Parent记录,但是记录ON DELETE不明确。它可能意味着删除Parent记录后删除记录Child,也可能意味着删除Child记录时删除记录Parent。那是什么呢? 我希望语法为ON PARENT DELETE, CASCADE,ON FOREIGN DELETE, CASCADE或类似的东西来消除歧义。有没有人记得这件事的助记符?

3
如何插入包含外键的行?
使用PostgreSQL v9.1。我有以下表格: CREATE TABLE foo ( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY, type VARCHAR(60) NOT NULL UNIQUE ); CREATE TABLE bar ( id BIGSERIAL NOT NULL UNIQUE PRIMARY KEY, description VARCHAR(40) NOT NULL UNIQUE, foo_id BIGINT NOT NULL REFERENCES foo ON DELETE RESTRICT ); 假设第一个表foo是这样填充的: INSERT INTO foo (type) …

3
mysql中On Delete Cascade和On Update Cascade之间的区别
我在MySQL数据库中有两个表parent,child。我试图基于父表将外键引用添加到我的子表中。有没有之间的任何显著差异ON UPDATE CASCADE和ON DELETE CASCADE 我的父母表 CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; 我的问题是:以下sql查询之间有什么区别。 ON DELETE CASCADE CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE ) ENGINE=INNODB; ON UPDATE CASCADE CREATE TABLE child …

2
MySQL:如何检查与表相关的外键
如何在MySql中查看与表相关的外键? 背景:我想在MySql中删除具有外键约束的表。当我这样做时,我得到: Error Code: 1217. Cannot delete or update a parent row: a foreign key constraint fails 我该如何删除与表相关的外键而使其他人离开。

3
使用多个用逗号分隔的外键是否错误?如果是,为什么?
有两个表:Deal和DealCategories。一笔交易可以有很多交易类别。 因此,正确的方法应该是制作一个DealCategories具有以下结构的表: DealCategoryId (PK) DealId (FK) DealCategoryId (FK) 但是,我们的外包团队通过Deal以下方式将多个类别存储在表中: DealId (PK) DealCategory -- In here they store multiple deal ids separated by commas like this: 18,25,32. 我觉得他们做错了,但是我不知道如何清楚地解释为什么这是不对的。 我应该如何向他们解释这是错误的?或者也许我是错的人,这是可以接受的?

1
需要外键索引
我在索引,主键和外键上苦苦挣扎,而且都需要全部使用。 如果我有两个表,它们两个都有一个整数作为主键。 第一个表通过FK引用第二个表的主键。 在两个表上,我在ID列上都有一个主键索引 我在table1.ref_field参照第二张表格(table2.id)的PK时创建了FK约束 我在上添加了一个索引 table1.ref_field 这是组织这些索引(主键和外键)的最佳方法吗?


3
可以使用循环外键引用\如何避免使用它们?
在外键字段的两个表之间具有循环引用是否可以接受? 如果没有,如何避免这些情况? 如果是这样,如何插入数据? 以下是一个循环引用(在我看来)可以接受的示例: CREATE TABLE Account ( ID INT PRIMARY KEY IDENTITY, Name VARCHAR(50) ) CREATE TABLE Contact ( ID INT PRIMARY KEY IDENTITY, Name VARCHAR(50), AccountID INT FOREIGN KEY REFERENCES Account(ID) ) ALTER TABLE Account ADD PrimaryContactID INT FOREIGN KEY REFERENCES Contact(ID)

2
什么是“部分匹配指数”?
我试图了解有关SQL Server 2016中引入的“外键引用检查”查询计划运算符的更多信息。那里没有很多有关它的信息。微软在这里宣布了它,我在这里发表了博客。通过从具有254个或更多传入外键引用的父表中删除一行,可以看到new运算符:dbfiddle link。 操作员详细信息中显示三种不同的计数: 外键引用计数是传入外键的数量。 没有匹配的索引计数是没有合适索引的传入外键的数量。验证更新或删除的表不会违反该约束将需要对子表进行扫描。 我不知道部分匹配索引计数代表什么。 在这种情况下,什么是部分匹配索引?我无法进行以下任何工作: 筛选索引 将外键列作为INCLUDE索引的列 使用外键列作为第二个键列的索引 多列外键的单列索引 创建多个覆盖索引以为多列外键启用“索引连接”计划 Dan Guzman指出,即使索引键的顺序与外键列的顺序不同,多个列的外键也可以匹配索引。他的代码是在这里,以防有人能够以它为起点来进一步了解部分匹配索引。

2
当表引用自身时,如何编写查找所有循环引用的查询?
我有以下架构(名称已更改),无法更改: CREATE TABLE MyTable ( Id INT NOT NULL PRIMARY KEY, ParentId INT NOT NULL ); ALTER TABLE MyTable ADD FOREIGN KEY (ParentId) REFERENCES MyTable(Id); 也就是说,每个记录都是另一个记录的子级。如果一条记录ParentId等于它的Id,则该记录被视为根节点。 我想运行查询,将找到所有循环引用。例如,与数据 INSERT INTO MyTable (Id, ParentId) VALUES (0, 0), (1, 0), (2, 4), (3, 2), (4, 3); 查询应返回 Id | Cycle 2 | 2 …

2
“ ibfk”在MySQL中代表什么?
如果我在phpmyadmin中为表“ photos”创建外键约束,则稍后会看到该约束名为“ photos_ibfk_1”,下一个约束名为“ photos_ibfk_2”,依此类推。由此,我得出[tablename] _ibfk_constraintIndex为MySQL中数据库约束的约定。它是否正确?IBFK代表什么?

3
如何与有特权的孩子建立一对多关系?
我想建立一对多关系,其中对于每个父母,一个或零个孩子被标记为“收藏夹”。但是,并不是每个父母都会有一个孩子。(例如,将父母视为本网站上的问题,将孩子视为答案,将喜欢的事物作为接受的答案。)例如, TableA Id INT PRIMARY KEY TableB Id INT PRIMARY KEY Parent INT NOT NULL FOREIGN KEY REFERENCES TableA.Id 我看到的方式可以将以下列添加到TableA中: FavoriteChild INT NULL FOREIGN KEY REFERENCES TableB.Id 或TableB的以下列: IsFavorite BIT NOT NULL 第一种方法的问题在于它引入了可为空的外键,据我所知,它不是标准化形式。第二种方法的问题是,需要做更多的工作以确保最多一个孩子是最爱的。 我应该使用哪种标准来确定使用哪种方法?或者,还有其他我没有考虑的方法吗? 我正在使用SQL Server 2012。

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 …

3
为什么表将其主键用作自身的外键
浏览数据库时,我遇到了一个表,该表使用其主键作为自身的外键。 我已经看到,表本身可以具有外键来构建层次结构,但是它将使用另一列来引用主键。 由于主键是唯一的,因此在这种情况下行是否只能指向自身?这似乎是一个重言式的链接,因为如果我已经有了该行,那么我已经有了该行。 有什么理由要这样做吗? 我确定约束是以这种方式编写的(不仅仅是查看图表),因为相同的表和列用于定义的两半。


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.