【发布时间】:2023-04-10 09:08:01
【问题描述】:
基本上我有几个不同的表,它们共享一个数组字段job_ids,每个表都有自己的status,它也是一个整数。在job 表上,id 是它的主键。
Postgres 12.5 版
表table1:
CREATE TABLE table1 (
id serial NOT NULL,
jobs_ids _int4 NULL,
status int4 NULL,
CONSTRAINT cable_pkey PRIMARY KEY (id)
表job:
CREATE TABLE job (
id serial NOT NULL,
description varchar NULL,
created_at timestamptz NULL DEFAULT now(),
modified_at timestamptz NULL DEFAULT now(),
CONSTRAINT job_pkey PRIMARY KEY (id)
我的触发函数:
CREATE OR REPLACE FUNCTION new_job_id_table1()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
if new.status= 3 and new.jobs_ids = '{}' then
insert into job (description, type_id)
select 'automated jobid with id=' || new.id, 1;
new.jobs_ids := array[ max(b.id) ] from job b
where new.jobs_ids = '{}' and b.type_id = 1;
end if;
RETURN NEW;
END;
$function$;
触发器,设置为更新前运行:
create trigger job_id_trigger_table1
before update of status on table1
for each row execute function new_job_id_table1();
用户通过 qgis 更新内容,但通常是:
update table1 set status = 3 where id = $whatever_id_they_picked;
它在job 表中创建一个新条目,并将该id 分配给table1 中的更新行。
如果用户将table1 中的一行更新为状态 3,它可以正常工作。但是,当用户一次更新多行时,它什么也不做。
如果一次更新多行,我只想为table1 中的几行生成一个作业ID,而不是(当前)多个。
如何使触发器与多行更新一起工作?
【问题讨论】:
-
请提供显示数据类型和约束的有效
CREATE TABLE脚本,而不是关于所述表的散文。第一个非常有用,第二个没多大用。并且始终是您的 Postgres 版本。 -
@ErwinBrandstetter 我已经编辑了操作
-
我看到一个函数定义,但没有触发器定义。 “用户更新功能”也是一个不明确的定义。什么“特点”?
UPDATE?INSERT?究竟什么是“同时”?在同一个命令中?太模糊了。 -
@ErwinBrandstetter 再次编辑
标签: sql postgresql database-design triggers