Sql 触发器函数更新所有行,而不是一行
我有表“订单”,当我在列“跟踪代码”(默认值为空)中添加值时,我想自动更改列“订单状态”,但我的触发器函数更改列“订单状态”中的所有行。我试图更改函数中的if语句,但我没有成功。请帮我回答这个问题! 这是我的表格“订单”: 和表“订单状态”: 这是我的触发器和功能:Sql 触发器函数更新所有行,而不是一行,sql,database,postgresql,triggers,Sql,Database,Postgresql,Triggers,我有表“订单”,当我在列“跟踪代码”(默认值为空)中添加值时,我想自动更改列“订单状态”,但我的触发器函数更改列“订单状态”中的所有行。我试图更改函数中的if语句,但我没有成功。请帮我回答这个问题! 这是我的表格“订单”: 和表“订单状态”: 这是我的触发器和功能: id | order_status_id | tracking_code ----+-----------------+--------------- 12 | 2 | 123456 9 |
id | order_status_id | tracking_code
----+-----------------+---------------
12 | 2 | 123456
9 | 2 |
6 | 2 |
7 | 2 |
10 | 2 |
8 | 2 |
11 | 2 |
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();
您需要将更新后的订单id传递给
状态\u功能
:
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;
然后,在更新状态中:
PERFORM status_function(old.id);
请尝试以下操作以将更新仅限于当前行:
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;
您的
status\u函数()
是对订单的无条件更新。我知道status\u函数中有我的错误!但是你能澄清你的答案吗?更新没有限制。它将把订单中的所有行更新为订单状态\u id=2
。