繁体   English   中英

连接时的SQL唯一性

[英]SQL Unique on join

我有一个应用程序,其中:

  1. 用户有很多应用
  2. 应用程序有3个不同的文档(每个文档一个表)。 在某些情况下,应用程序可以具有一个以上的每种文档。

我需要能够

  1. 用户在任何时候都只能拥有一个“批准”的应用程序-已实现
  2. 不能在属于2个不同用户的多个应用程序之间重用文档。

我被困在如何执行要求2上。

当前表结构:

CREATE TABLE applications (
    id integer NOT NULL,
    user_id bigint NOT NULL,
    status character varying(255) DEFAULT 'pending'::character varying NOT NULL,
    active boolean DEFAULT false NOT NULL,
    name character varying(255) DEFAULT NULL::character varying,
    email character varying(255) DEFAULT NULL::character varying,
    created_at timestamp without time zone DEFAULT now() NOT NULL,
    CONSTRAINT applications_status_values CHECK (((status)::text = ANY ((ARRAY['pending'::character varying, 'approved'::character varying, 'rejected'::character varying, 'archived'::character varying])::text[])))
);

文档类型的示例:

CREATE TABLE pan (
    id bigint NOT NULL,
    value character(10) NOT NULL,
    status document_statuses DEFAULT 'pending'::document_statuses,
    extra_data json,
    verified_at timestamp without time zone,
    reject_reason character varying,
    application_id bigint NOT NULL
);

看一下您的模型,我认为存在概念错误。

您说:不能在属于2个不同用户的多个应用程序之间重用文档

因此,换句话说,如果用户相同,则该文档只能在任何其他应用程序中重复使用。 因此,我们可以更深入地了解每个文档都有一个user_owner,并且此用户使用此文档时,所有文档都是正确的。

然后,我建议的是简单的解决方案:

ALTER TABLE pan ADD COLUMN user_id bigint NOT NULL REFERENCES user (user_id);

然后使用正确的值更新此字段。 这将简化您的解决方案,并为生成文档的用户添加参考。

编辑:

添加此触发器,thill将使用更新语句调用一个过程:

    CREATE TRIGGER t_document_owner
    AFTER UPDATE ON applications 
    FOR EACH ROW
    WHEN (OLD.user_id IS DISTINCT FROM NEW.user_id) 
    EXECUTE PROCEDURE p_update_document_owner(NEW.user_id,OLD.user_id);

这是更新过程的基本建议:

CREATE FUNCTION p_update_document_owner(new_user_id,old_user_id) RETURNS VOID
AS
'
UPDATE pan 
SET user_id=$1
WHERE user_id = 
(SELECT user_id 
 FROM (
      SELECT user_id 
      FROM pan WHERE      
      user_id=$2
      )as aux
)
'LANGUAGE SQL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM