[英]SQL Unique on join
我有一个应用程序,其中:
我需要能够
我被困在如何执行要求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.