如何在Trino中获取表DDL并用于SELECT或插入其他表?
Trino中表DDL的复用与批量获取方案
1. 将SHOW CREATE TABLE结果作为SELECT部分插入其他表
Trino中SHOW CREATE TABLE的结果可通过TABLE()函数转换为关系型数据集,从而嵌入到SELECT语句中完成插入操作。
操作示例:
- 先创建存储DDL的目标表(按需定义结构):
CREATE TABLE daptr_catalog.u_schema.table_ddls ( full_table_name VARCHAR, table_ddl VARCHAR ) WITH ( format = 'ORC' );
- 通过子查询将DDL插入目标表:
INSERT INTO daptr_catalog.u_schema.table_ddls (full_table_name, table_ddl) SELECT 'daptr_catalog.u_schema.test', create_table FROM TABLE(SHOW CREATE TABLE daptr_catalog.u_schema.test);
TABLE(SHOW CREATE TABLE ...)会将命令结果转为包含create_table列的表,可直接作为查询数据源使用。
2. 在SELECT中批量获取多张表的DDL
结合information_schema系统表和TABLE(SHOW CREATE TABLE ...)表函数,可批量查询指定范围内所有表的DDL:
SELECT CONCAT(t.table_catalog, '.', t.table_schema, '.', t.table_name) AS full_table_name, ct.create_table AS table_ddl FROM information_schema.tables t CROSS JOIN TABLE(SHOW CREATE TABLE CONCAT(t.table_catalog, '.', t.table_schema, '.', t.table_name)) ct WHERE t.table_catalog = 'daptr_catalog' AND t.table_schema = 'u_schema';
该语句会返回u_schema下所有表的完整名称及对应的DDL。
3. 除SHOW命令外的DDL获取方法
可通过查询Trino系统元数据表手动拼接DDL,适合需要自定义DDL格式的场景,但需注意不同连接器的元数据存储差异:
手动拼接DDL示例:
SELECT CONCAT( 'CREATE TABLE ', full_table_name, '(', column_defs, ') WITH (', table_props, ')' ) AS table_ddl FROM ( SELECT CONCAT(t.table_catalog, '.', t.table_schema, '.', t.table_name) AS full_table_name, -- 拼接字段定义 (SELECT STRING_AGG(CONCAT(c.column_name, ' ', c.data_type), ', ') FROM information_schema.columns c WHERE c.table_catalog = t.table_catalog AND c.table_schema = t.table_schema AND c.table_name = t.table_name) AS column_defs, -- 拼接WITH参数 (SELECT STRING_AGG(CONCAT(p.property_name, ' = ''', p.property_value, ''''), ', ') FROM system.metadata.table_properties p WHERE p.catalog_name = t.table_catalog AND p.schema_name = t.table_schema AND p.table_name = t.table_name) AS table_props FROM information_schema.tables t WHERE t.table_catalog = 'daptr_catalog' AND t.table_schema = 'u_schema' AND t.table_name = 'test' ) AS ddl_subquery;
这种方式需要自行处理字段顺序、约束、特殊数据类型等细节,准确性依赖对元数据结构的熟悉程度,不如SHOW CREATE TABLE直接可靠。
内容的提问来源于stack exchange,提问作者Martin Fedy Fedorko
相关产品推荐
相关产品推荐

