pgSQL,动态删除表语句

时间:2013-09-12 08:12:43

标签: sql postgresql sql-drop

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

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

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

1 个答案:

答案 0 :(得分:1)

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