Sql 如何在插入新记录之前更新所有记录?

Sql 如何在插入新记录之前更新所有记录?,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我希望当我将新记录放入表中时,在插入之前,我希望将旧记录更新为ghost(有些像disable),并最终添加这个新记录。所以我准备了一个简单的触发函数 CREATE OR REPLACE FUNCTION trg_ghost_game_seed_ins_bef() RETURNS trigger AS $$ BEGIN UPDATE dice_game_seed SET ghost = true WHERE ghost = false; RETURN NEW; END $$ LANG

我希望当我将新记录放入表中时,在插入之前,我希望将旧记录更新为ghost(有些像disable),并最终添加这个新记录。所以我准备了一个简单的触发函数

CREATE OR REPLACE FUNCTION trg_ghost_game_seed_ins_bef()
  RETURNS trigger AS
$$
BEGIN
    UPDATE dice_game_seed SET ghost = true WHERE ghost = false;
RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER ins_up_bef
BEFORE INSERT OR UPDATE ON dice_game_seed
FOR EACH ROW
EXECUTE PROCEDURE trg_ghost_game_seed_ins_bef();
当我尝试插入新记录时,我得到了一些信息

SQL statement "UPDATE dice_game_seed SET ghost = true WHERE ghost = false"
PL/pgSQL function "trg_ghost_game_seed_ins_bef" line 3 at SQL statement

但是3号线有什么问题

您可以使用
pg\u trigger\u depth()
函数来处理无限递归:

create or replace function trg_ghost_game_seed_ins_bef()
  returns trigger as
$$
begin
    if (pg_trigger_depth() = 1) then
        update dice_game_seed set ghost = true where ghost = false;
    end if;
    return null;
end
$$ language plpgsql;

create trigger ins_up_bef
before insert or update on dice_game_seed
for each statement
execute procedure trg_ghost_game_seed_ins_bef();
您还可以使用语句触发器而不是行触发器


您告诉触发器:更新时更新,就像一个无止境的循环。如果您使用任何类型的事务,这种方法不是毫无意义的。只是猜测而已。