0

我想从数据库中动态删除一些表。我先选择它们,然后我尝试使用 delete 语句,但它不起作用。

tmp TEXT;
FOR tmp IN SELECT names from Garbage
LOOP
    DROP TABLE tmp;
END LOOP; 

但不幸的是,我在 drop 语句中遇到了错误。它总是试图删除表“tmp”而不是删除 tmp 的值(这是一些字符串,如“table1”“table2”)。

4

1 回答 1

2

您将需要执行动态查询。为此,您需要构建查询并调用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)。

于 2013-09-12T11:48:05.093 回答