我想使用一个 SQL 命令/查询,从同一数据库中删除所有具有相同前缀(“supenh_agk”)的表。
为了在一个命令中完成这个操作,您需要使用带有EXECUTE
的动态SQL语句,在DO
语句(或函数)中实现:
DO
$do$
DECLARE
_tbl text;
BEGIN
FOR _tbl IN
SELECT quote_ident(table_schema) || '.'
|| quote_ident(table_name) -- escape identifier and schema-qualify!
FROM information_schema.tables
WHERE table_name LIKE 'prefix' || '%' -- your table name prefix
AND table_schema NOT LIKE 'pg\_%' -- exclude system schemas
LOOP
RAISE NOTICE '%',
-- EXECUTE
'DROP TABLE ' || _tbl; -- see below
END LOOP;
END
$do$;
RAISE
并取消注释EXECUTE
。CASCADE
: 'DROP TABLE ' || _tbl || ' CASCADE;
密切相关:
或者,您可以基于目录表pg_class
构建,该表还提供了表的oid
,速度更快:
...
FOR _tbl IN
SELECT c.oid::regclass::text -- escape identifier and schema-qualify!
FROM pg_catalog.pg_class c
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname NOT LIKE 'pg\_%' -- exclude system schemas
AND c.relname LIKE 'prefix' || '%' -- your table name prefix
AND c.relkind = 'r' -- only tables
...
系统目录还是信息模式?
c.oid :: regclass
如何防止 SQL 注入攻击?
或者 在单个DROP
命令中完成所有操作。应该更有效率:
DO
$do$
BEGIN
RAISE NOTICE '%', (
-- EXECUTE (
SELECT 'DROP TABLE ' || string_agg(format('%I.%I', schemaname, tablename), ', ')
-- || ' CASCADE' -- optional
FROM pg_catalog.pg_tables t
WHERE schemaname NOT LIKE 'pg\_%' -- exclude system schemas
AND tablename LIKE 'prefix' || '%' -- your table name prefix
);
END
$do$;
相关信息:
在上一个示例中,使用方便的系统目录pg_tables
。并使用format()
进行方便操作。请参见:
CASCADE
一直存在,与 pg 12 无关。它强制删除所有相关对象,否则是被禁止的。 - Erwin BrandstetterSELECT table_name
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'sales_%';
步骤 2: 点击“下载CSV”按钮。
步骤 3: 在编辑器中打开文件,并用,sales替换"sales_和用一个空格替换"
步骤 4: DROP TABLE sales_regist, sales_name, sales_info, sales_somthing;
SELECT 'DROP TABLE "' || TABLE_NAME || '"'
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
[编辑]
begin
for arow in
SELECT 'DROP TABLE "' || TABLE_NAME || '"' as col1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '[prefix]%'
LOOP
--RAISE NOTICE '%',
EXECUTE 'DROP TABLE ' || arow ;
END LOOP;
end;