当前位置: 首页 > 面试题库 >

获取引用(通过外键)表中特定行的所有行

万俟宜修
2023-03-14
问题内容

这似乎很简单,但是我一直无法找到这个问题的答案。

我想要什么?
一个具有行的主表,这些行在不再被引用(通过外键)时会自行删除。该解决方案可能特定于PostgreSql,也可能不特定于PostgreSql。

如何?
我解决此问题的方法之一(实际上,到目前为止是唯一的方法)涉及以下内容:对于引用该主表的每个表(在某行UPDATEDELETE某行上),检查主表中被引用的行以及其他多少行仍然参考引用的行。如果它降到零,那么我也要删除master中的该行。

(如果您有更好的主意,我想知道!)

详细说明: 我有一个主表,该表被其他许多人引用

CREATE TABLE master (
  id serial primary key,
  name text unique not null
);

所有其他表通常具有相同的格式:

CREATE TABLE other (
  ...
  master_id integer references master (id)
  ...
);

如果其中之一不在NULL,它们指的是一行master。如果我去尝试删除它,我将收到一条错误消息,因为它已经被引用:

ERROR:  update or delete on table "master" violates foreign key constraint "other_master_id_fkey" on table "other"
DETAIL:  Key (id)=(1) is still referenced from table "other".
Time: 42.972 ms

请注意,即使我引用了很多表,也不需要花费太长时间来解决这个问题master。我如何找到这些信息而不必引发错误?


问题答案:

您可以执行以下操作之一:

1)将reference_count字段添加到主表。在明细表上使用触发器会增加reference count每次master_id添加此行的时间。删除行时减少计数。当reference_count达到0时-删除记录。

2)使用pg_constrainttable(在此处查看详细信息)获取引用表的列表并创建动态SQL查询。

3)在每个明细表上创建触发器,该触发器将master_id在主表中删除。使错误消息静音BEGIN ... EXCEPTION ... END



 类似资料:
  • 引导表有一个获取所有隐藏行的方法: getRowsHidden;布尔型;将所有行隐藏起来,如果您传递show参数true,这些行将再次显示,否则,该方法将只返回隐藏的行。 它也有 getHiddenColumns-获取隐藏列。 getVisibleColumns-获取可见列 但是,如何使用BT方法或JQuery组合获得所有可见行?

  • 问题内容: 有什么方法可以简化此代码,以获取提供的某一列的索引以获取特定行的索引吗?在这种情况下,索引将为,因为我要遍历第一列直到找到“ A”。感觉应该对此有一个linq解决方案,但我无法弄清楚。 问题答案: 如果使用DataTableExtensions.AsEnumerable()方法,则可以使用LINQ查询您的DataTable。然后,您可以用来确定给定谓词的索引:

  • 问题内容: 我需要在SQL Server数据库中删除一个高度引用的表。我如何获取要删除表需要删除的所有外键约束的列表? (与在Management Studio的GUI中单击相比,SQL回答更可取。) 问题答案: 不知道为什么没有人建议,但是我用来查询给定表的外键: 您还可以指定架构: 在未指定架构的情况下,文档规定以下内容: 如果未指定pktable_owner,则适用基础DBMS的默认表可见性

  • 如何按特定单词获取所有数据和订单。例如,我有列名状态。状态为“已批准”、“待定”、“已拒绝”的存储。 如何对数据进行排序,如按降序显示所有状态“待定”?

  • 这是一个简单的问题。我们需要使用YouTube API将所有视频上传到我们的Android应用程序中的频道。根据YouTube API v2.0文档,这是一个非常简单的情况——https://developers . Google . com/YouTube/2.0/developers _ guide _ protocol _ video _ feeds # User _ Uploaded _