我需要从我的数据库中删除一些序列,有很多这样的序列,所以我想编写一条 SQL 语句来一次删除它们,所以我这样做了:
do
$$
declare rec RECORD;
begin
FOR rec in
select relname from pg_class where relkind = 'S' and relname like 'XXX_%_seq'
loop
drop sequence rec.relname; # HERE is the problem, I cannot directly use rec.relname here
end loop;
end;
$$
如何将
rec.relname
与 drop sequence
一起使用?
要在 PL/pgSQL 块中使用 rec.relname 动态删除序列,您不能直接将 DROP SEQUENCE 与记录属性一起使用。相反,您需要将动态 SQL 与 EXECUTE 语句结合使用。您可以通过以下方式修改代码来实现此目的:
DO
$$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT relname FROM pg_class WHERE relkind = 'S' AND relname LIKE 'XXX_%_seq'
LOOP
EXECUTE 'DROP SEQUENCE ' || quote_ident(rec.relname);
END LOOP;
END;
$$
quote_ident 函数用于在需要时安全地引用标识符,例如,如果您的序列名称包含特殊字符或保留字。