Sql 截断选择表\u名称时出现语法错误
我正在使用PostgreSQL,并尝试截断所有以Sql 截断选择表\u名称时出现语法错误,sql,database,postgresql,dynamic-sql,Sql,Database,Postgresql,Dynamic Sql,我正在使用PostgreSQL,并尝试截断所有以'beach'开头的表 换句话说,我想做一些类似的事情: Truncate (SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_name LIKE 'beach_%') 有什么想法吗?这不是有效的语法。不能对子查询使用TRUNCATE(请参阅)。此外,您可能需要遍历这些表并截断它们
'beach'
开头的表换句话说,我想做一些类似的事情:
Truncate (SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' AND table_name LIKE 'beach_%')
有什么想法吗?这不是有效的语法。不能对子查询使用
TRUNCATE
(请参阅)。此外,您可能需要遍历这些表并截断它们 您可以运行此查询
SELECT 'truncate ' || table_name || ';'
FROM information_schema.tables
WHERE table_schema='public' AND table_name LIKE 'beach%'
这将返回一行,如
truncate someTableName;
从海滩开始的每张桌子
复制结果集,粘贴它,然后执行它
请参见以下是创建动态SQL的方法:
executeimmediate
TRUNCATE
中不能对表名使用wilcards或patterns。您需要动态组合SQL命令。您可以像已通知的那样,通过两次往返服务器来完成此操作,也可以使用一条语句:
DO
$do$
BEGIN
EXECUTE (
-- RAISE NOTICE '%', ( -- better check before you execute ..
SELECT 'TRUNCATE ' || string_agg(c.oid::regclass::text, ', ')
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname LIKE 'beach_%'
AND c.relkind = 'r'
AND n.nspname = 'public'
);
END
$do$;
创建并执行以下表单的命令:
TRUNCATE beach_foo, beach_bar, ...
您可能需要/必须在命令末尾添加CASCADE
相关答案:考虑信息模式和系统目录之间的细微差异:
您可能希望也可能不希望改为查询
信息\u schema.tables
。最重要的是():
只有那些表和视图显示当前用户具有访问权限
(作为所有者或拥有某种特权)
粗体强调我的。最后我尝试了这个
ResultSet resultSet=stmt.executeQuery("SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_name LIKE 'beach_%'");
while (resultSet.next()) {
list_tables.add(resultSet.getString("table_name"));
}
for (String table : list_tables) {
stmt.executeUpdate("TRUNCATE "+table);
}
它工作正常您不能用这种方式使用truncate。您需要创建动态SQL语句字符串并执行它们。
beach
或bridge
?我以你为例。