【问题标题】:Conditional logic for ON DELETE foreign key referenceON DELETE 外键引用的条件逻辑
【发布时间】:2016-12-12 10:46:21
【问题描述】:

我希望能够为外键 ON DELETE 约束执行一些逻辑。根据逻辑,我会想要 CASCADE 或 RESTRICT。

我的桌子:

CREATE TABLE users (
  user_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY
);

CREATE TABLE teams (
  team_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY
);

CREATE TABLE documents (
  document_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY
  user_id uuid REFERENCES users ON DELETE /*do logic here*/,
  team_id uuid REFERENCES teams ON DELETE /*do logic here*/,
  content text
);

在我的(非常基本的)表中,document 可以由user 和/或team 拥有。

关于documents,如果有人删除了文档的用户并且文档的team_id 为空,则将删除内容 CASCADE 到文档(反之亦然,使用 user_id 和 team_id)。

否则,如果有人删除了某个文档的用户,并且该文档的 team_id 不是 NULL,则 RESTRICT 删除该用户(反之亦然,使用 user_id 和 team_id)。

我在文档中没有看到任何实现此目的的方法。我需要在我的服务器代码而不是数据库中执行此逻辑吗?我想要额外的数据完整性层。

【问题讨论】:

    标签: sql postgresql constraints


    【解决方案1】:

    这很有可能,但不是直接的。你需要一个触发器。首先设置外键为 RESTRICT

    CREATE TABLE documents (
      document_id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
      user_id uuid REFERENCES users ON DELETE RESTRICT,
      team_id uuid REFERENCES teams ON DELETE RESTRICT,
      content text
    );
    

    然后为用户表创建触发器函数和触发器

    CREATE OR REPLACE FUNCTION user_delete()
    RETURNS TRIGGER AS $$
    BEGIN
        DELETE FROM documents WHERE team_id IS NULL and user_id = OLD.user_id;
        RETURN OLD;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER user_delete_trigger BEFORE DELETE ON users FOR EACH ROW     EXECUTE PROCEDURE user_delete();
    

    然后对团队表执行相同操作。

    CREATE OR REPLACE FUNCTION team_delete()
    RETURNS TRIGGER AS $$
    BEGIN
        DELETE FROM documents WHERE user_id IS NULL and team_id = OLD.team_id;
        RETURN OLD;
    END;
    $$ LANGUAGE plpgsql;
    
    CREATE TRIGGER team_delete_trigger BEFORE DELETE ON users FOR EACH ROW     EXECUTE PROCEDURE team_delete();
    

    我相信这正是您想要的。

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 2019-10-06
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2012-02-11
      • 2019-04-02
      相关资源
      最近更新 更多