Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 触发器函数更新所有行,而不是一行_Sql_Database_Postgresql_Triggers - Fatal编程技术网

Sql 触发器函数更新所有行,而不是一行

Sql 触发器函数更新所有行,而不是一行,sql,database,postgresql,triggers,Sql,Database,Postgresql,Triggers,我有表“订单”,当我在列“跟踪代码”(默认值为空)中添加值时,我想自动更改列“订单状态”,但我的触发器函数更改列“订单状态”中的所有行。我试图更改函数中的if语句,但我没有成功。请帮我回答这个问题! 这是我的表格“订单”: 和表“订单状态”: 这是我的触发器和功能: id | order_status_id | tracking_code ----+-----------------+--------------- 12 | 2 | 123456 9 |

我有表“订单”,当我在列“跟踪代码”(默认值为空)中添加值时,我想自动更改列“订单状态”,但我的触发器函数更改列“订单状态”中的所有行。我试图更改函数中的if语句,但我没有成功。请帮我回答这个问题! 这是我的表格“订单”

和表“订单状态”

这是我的触发器功能

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