1. DROP 语句是干嘛的
DROP 语句用于从当前或指定的 Catalog 中移除已注册对象,包括 Catalog、Database、Table、View、Function、Model 等。
Flink SQL 目前支持:
DROP CATALOGDROP TABLEDROP DATABASEDROP VIEWDROP FUNCTIONDROP MODEL
2. Java 中如何执行 DROP(TableEnvironment.executeSql)
DROP 语句在 Java 侧的执行方式和 CREATE 一样:调用 TableEnvironment.executeSql(),成功返回 OK,失败抛异常。
示例流程(注册表 → 列表查看 → 删除表 → 再查看):
java
TableEnvironment tableEnv = TableEnvironment.create(...);
// register a table named "Orders"
tableEnv.executeSql(
"CREATE TABLE Orders (`user` BIGINT, product STRING, amount INT) WITH (...)"
);
// list tables
String[] tables = tableEnv.listTables();
// or: tableEnv.executeSql("SHOW TABLES").print();
// drop table from catalog
tableEnv.executeSql("DROP TABLE Orders");
// list tables again
String[] tables2 = tableEnv.listTables();
3. DROP CATALOG:删除整个 Catalog
3.1 语法
sql
DROP CATALOG [IF EXISTS] catalog_name;
3.2 行为要点
IF EXISTS:catalog 不存在时不报错,直接忽略。
4. DROP TABLE:删除表(支持 TEMPORARY)
4.1 语法
sql
DROP [TEMPORARY] TABLE [IF EXISTS] [catalog_name.][db_name.]table_name;
4.2 行为要点
- 不加
IF EXISTS:表不存在会抛异常。 TEMPORARY:删除临时表(带 catalog/db 命名空间的临时对象)。
5. DROP DATABASE:删除库(RESTRICT / CASCADE 很关键)
5.1 语法
sql
DROP DATABASE [IF EXISTS] [catalog_name.]db_name [ (RESTRICT | CASCADE) ];
5.2 RESTRICT vs CASCADE
RESTRICT(默认):如果库非空(还有表/函数),会报错,防止误删。CASCADE:删除非空库时,会连同库内关联的表与函数一起删除。
生产建议:
- 日常运维优先用默认
RESTRICT,避免一条命令清空库。 - 自动化清理/测试环境可用
CASCADE,但必须加确认机制或白名单。
6. DROP VIEW:删除视图(临时视图 + 依赖坑)
6.1 语法
sql
DROP [TEMPORARY] VIEW [IF EXISTS] [catalog_name.][db_name.]view_name;
6.2 依赖不会被 Flink 自动维护(重要)
Flink 文档明确提示:Flink 不会像一些数据库那样用 CASCADE/RESTRICT 维护视图依赖。当前表现是:如果视图引用的底层表被删了,Flink 不会自动删视图,而是等你下次使用视图时抛"延迟错误"。
工程建议:
- 删除底表前,先
SHOW CREATE VIEW/ 维护一份视图依赖清单(如果你有大量视图)。 - 或者在你自己的 Catalog/元数据层做依赖治理(血缘/依赖图)。
7. DROP FUNCTION:删除函数(TEMPORARY / TEMPORARY SYSTEM)
7.1 语法
sql
DROP [TEMPORARY | TEMPORARY SYSTEM] FUNCTION [IF EXISTS]
[catalog_name.][db_name.]function_name;
7.2 行为要点
TEMPORARY:删临时 catalog functionTEMPORARY SYSTEM:删临时系统函数(无命名空间)IF EXISTS:不存在不报错
8. DROP MODEL:删除模型对象(Flink ML / 外部模型提供方)
8.1 语法
sql
DROP [TEMPORARY] MODEL [IF EXISTS] [catalog_name.][db_name.]model_name;
8.2 行为要点
- 不加
IF EXISTS:不存在会抛异常 - 加
IF EXISTS:不存在忽略
9. 安全删除最佳实践(建议你放在博客结尾)
- 习惯性加
IF EXISTS:脚本幂等化,避免多环境执行失败。 - DROP DATABASE 默认用 RESTRICT:除非你非常确定要"连锅端"。
- 删底表前处理视图依赖:Flink 不会帮你级联维护视图,避免"延迟炸雷"。
- 区分 TEMPORARY 对象与持久对象:临时对象生命周期通常跟会话/作业相关,误删/漏删都会让排障更难。