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

级联删除两个外键约束

舒斯伯
2023-03-14
问题内容

我有以下示例:

Table A
   -some_id

Table B
   -another_id

Table C
   -some_id_fk
   -another_id_fk

我想在级联排Table C如果双方some_idanother_id从各自的表被删除。

删除两个外键后,如何在表C中级联自身?

如果仅删除一个FK,则受影响的行应在引用该外键的列中更改为空值。


问题答案:

我建议使用两个外键约束ON DELETE SET NULL和一个触发器来处理其余的

表格:

CREATE TABLE a (a_id serial PRIMARY KEY, a text NOT NULL);
CREATE TABLE b (b_id serial PRIMARY KEY, b text NOT NULL);

CREATE TABLE ab (
  ab_id serial PRIMARY KEY
, a_id int REFERENCES a ON DELETE SET NULL
, b_id int REFERENCES b ON DELETE SET NULL
, UNIQUE (a_id, b_id)
);

扳机:

CREATE OR REPLACE FUNCTION trg_ab_upbef_nulldel()
  RETURNS trigger AS
$func$
BEGIN
DELETE FROM ab WHERE ab_id = NEW.ab_id;
RETURN NULL;
END
$func$ LANGUAGE plpgsql;

CREATE TRIGGER upbef_nulldel
BEFORE UPDATE OF a_id, b_id ON ab
FOR EACH ROW
WHEN (NEW.a_id IS NULL AND
      NEW.b_id IS NULL)
EXECUTE PROCEDURE trg_ab_upbef_nulldel();

SQL提琴。

  • 确保连接表具有替代PK列。(a_id, b_id)无论如何都不能是PK,因为那将不允许两者都为NULL。而是添加一个UNIQUE约束,该约束允许使用NULL值。

  • 触发器针对性能进行了优化,只有在更新两个FK列之一时才启动,并且仅当这两个结果都为时才触发NULL

  • 触发函数很简单:删除行并返回NULL来取消级联的void UPDATE



 类似资料:
  • 问题内容: 我想使用外键来保持完整性并避免使用孤立键(我已经使用过innoDB)。 如何创建在CASCADE上删除的SQL语句? 如果我删除一个类别,那么如何确保它不会删除也与其他类别相关的产品。 数据透视表“ categories_products”在其他两个表之间创建多对多关系。 问题答案: 如果您的级联删除某个产品是因为该产品属于被杀类别的成员,那么它会删除该产品,那么您的外键设置不正确。给

  • 问题内容: 我有两个像这样的表: 因此,逻辑很简单,用户删除了类别x下​​的所有书籍,从猫中删除了x之后,我尝试了上述方法,但不起作用,在我清理了表格书籍后,表格类别仍被填充,这是怎么回事? 问题答案: 具有级联删除功能的外键意味着,如果删除父表中的记录,则子表中的相应记录将被自动删除。这称为级联删除。 您说的是相反的意思,这不是当您从子表中删除时会将记录从父表中删除。 ON DELETE CAS

  • 在数据库中,将有一个列,并对的列具有外键约束。 对于在删除时级联的外键约束,可能执行的一些操作包括、和。这给出了以下方案组合。 a:在JPA中对父级进行级联删除调用,在删除父行时删除数据库中的子级。 b:在JPA中级联删除,在父删除时将子表中的外键列设置为null。在这种情况下,@joincolumn中的和中的可能需要为true/false。 C:在JPA中进行级联删除,在数据库中对外键删除不做任

  • 问题内容: 我有两个表:航迹和航路点,一个航迹可以有多个航路点,但是航路点仅分配给1条航迹。 在点表的方式中,我有一个名为“ trackidfk”的列,一旦创建了轨道,该列就会插入track_ID,但是我没有在此列上设置外键约束。 删除轨道时,我想删除分配的航点,这可能吗?我读过有关使用触发器的信息,但我认为Android不支持它们。 要创建航点表: 问题答案: 支持带有on delete级联的外

  • Django演示了如何设置或覆盖在文档中使用外键的级联删除。 但是如果我们想让这种效果反过来呢?如果我们希望fk模型的删除导致该模型的删除,该怎么办? 谢谢

  • 问题内容: 我花了很多时间试图弄清楚如何在一段时间内为SQL Server上的递归主键实现 CASCADE ON DELETE 。我已经阅读了有关触发器,创建临时表等的信息,但是还没有找到适合我的数据库设计的答案。 这是一个Boss / Employee数据库示例,将用于演示目的: 如您所见,每个员工都有一个老板,同时也是一个员工。因此,在id / boss_id上存在PK / FK关系。 这是带