我想从数据库中动态删除一些表。我首先选择它们,然后我尝试使用删除语句,但它不起作用。
tmp TEXT;
FOR tmp IN SELECT names from Garbage
LOOP
DROP TABLE tmp;
END LOOP;
但不幸的是,我在 drop 语句中遇到了错误。它总是试图删除表"tmp"而不是删除tmp的值(这是一些字符串,如"table1"table2")。
您需要执行动态查询。为此,您需要构造查询并调用EXECUTE
:
DECLARE
tmp TEXT;
...
BEGIN
...
FOR tmp IN SELECT names FROM Garbage
LOOP
EXECUTE 'DROP TABLE ' || quote_ident(tmp);
END LOOP;
...
请注意,我用quote_ident
正确转义了名称,它更好,更安全。但是,如果你创建了一个表,比如说命名为MyTable
但在创建时没有引用(双引号),PostgreSQL 也会将其名称存储为 mytable
,所以quote_ident('MyTable')
会生成不存在的"MyTable"
,你应该照顾它(例如,始终使用小写名称或始终引用您的 ID)。