Sql 如何在插入新记录之前更新所有记录?
我希望当我将新记录放入表中时,在插入之前,我希望将旧记录更新为ghost(有些像disable),并最终添加这个新记录。所以我准备了一个简单的触发函数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
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();
您还可以使用语句触发器而不是行触发器
您告诉触发器:更新时更新,就像一个无止境的循环。如果您使用任何类型的事务,这种方法不是毫无意义的。只是猜测而已。