如何解决触发功能更新所有行而不是一行
我有表“ orders ”,我想在列“ tracking_code ”中添加值时自动更改列“ order_status ” (默认值为null),但是我的触发函数更改了列“ order_status ”中的所有行,但是我尝试更改函数中的if语句,但没有成功。请帮我解决这个问题! 这是我的表格“ 订单”:
id | order_status_id | tracking_code
----+-----------------+---------------
12 | 2 | 123456
9 | 2 |
6 | 2 |
7 | 2 |
10 | 2 |
8 | 2 |
11 | 2 |
和表“ order_statuses ”:
id | status
----+-------------
1 | QUEUE
2 | IN_PROGRESS
3 | IN_DELIVERY
4 | DELIVERED
5 | CANCELED
6 | RETURNED
这是我的触发和功能:
CREATE or REPLACE FUNCTION status_function() RETURNS VOID AS $$
BEGIN
UPDATE public.orders SET order_status_id = public.order_statuses.id
FROM public.order_statuses
WHERE status = 'IN_DELIVERY';
END
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION status_update() RETURNS TRIGGER AS $$
BEGIN
IF (old.tracking_code != new.tracking_code) THEN
PERFORM status_function();
RETURN new;
ELSE
RETURN old;
END IF;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER change_status
AFTER UPDATE
OF tracking_code
ON orders
FOR EACH ROW
EXECUTE PROCEDURE status_update();
解决方法
请尝试这样的操作以将更新限制为仅当前行:
CREATE or REPLACE FUNCTION status_function(_id int) RETURNS VOID AS $$
BEGIN
UPDATE public.orders SET order_status_id = public.order_statuses.id
FROM public.order_statuses
WHERE status = 'IN_DELIVERY'
AND id = _id;
END
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION status_update() RETURNS TRIGGER AS $$
BEGIN
IF (old.tracking_code != new.tracking_code) THEN
PERFORM status_function(old.id);
RETURN new;
ELSE
RETURN old;
END IF;
END;
$$ LANGUAGE plpgsql;
,
您需要将更新的订单ID传递到status_function
:
CREATE or REPLACE FUNCTION status_function(bigint) RETURNS VOID AS $$
BEGIN
UPDATE public.orders SET order_status_id = public.order_statuses.id
FROM public.order_statuses
WHERE status = 'IN_DELIVERY' AND public.orders.id = $1;
END
$$ LANGUAGE plpgsql;
然后,在status_update
中:
PERFORM status_function(old.id);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。