如何在 PostgreSQL 中为现有表生成“创建表”SQL语句
如何在 PostgreSQL 中为现有表生成“创建表”SQL语句
我在postgreSQL中创建了一个表。我想查看用于创建表的SQL语句,但是找不出来。
我如何通过命令行或SQL语句获取现有表的create table
SQL语句?
admin 更改状态以发布 2023年5月23日
(注意-此解决方案不适用于PostgreSQL v12+)
我的解决方案是使用带有-E选项的psql登录postgres db,如下:
psql -E -U username -d database
在psql中,运行以下命令以查看postgres使用的sql来生成
描述表语句:
-- List all tables in the schema (my example schema name is public) \dt public.* -- Choose a table name from above -- For create table of one public.tablename \d+ public.tablename
基于运行这些描述命令后回显的sql,我能够组合出以下plpgsql函数:
CREATE OR REPLACE FUNCTION generate_create_table_statement(p_table_name varchar) RETURNS text AS $BODY$ DECLARE v_table_ddl text; column_record record; BEGIN FOR column_record IN SELECT b.nspname as schema_name, b.relname as table_name, a.attname as column_name, pg_catalog.format_type(a.atttypid, a.atttypmod) as column_type, CASE WHEN (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) IS NOT NULL THEN 'DEFAULT '|| (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef) ELSE '' END as column_default_value, CASE WHEN a.attnotnull = true THEN 'NOT NULL' ELSE 'NULL' END as column_not_null, a.attnum as attnum, e.max_attnum as max_attnum FROM pg_catalog.pg_attribute a INNER JOIN (SELECT c.oid, n.nspname, c.relname FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relname ~ ('^('||p_table_name||')$') AND pg_catalog.pg_table_is_visible(c.oid) ORDER BY 2, 3) b ON a.attrelid = b.oid INNER JOIN (SELECT a.attrelid, max(a.attnum) as max_attnum FROM pg_catalog.pg_attribute a WHERE a.attnum > 0 AND NOT a.attisdropped GROUP BY a.attrelid) e ON a.attrelid=e.attrelid WHERE a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum LOOP IF column_record.attnum = 1 THEN v_table_ddl:='CREATE TABLE '||column_record.schema_name||'.'||column_record.table_name||' ('; ELSE v_table_ddl:=v_table_ddl||','; END IF; IF column_record.attnum <= column_record.max_attnum THEN v_table_ddl:=v_table_ddl||chr(10)|| ' '||column_record.column_name||' '||column_record.column_type||' '||column_record.column_default_value||' '||column_record.column_not_null; END IF; END LOOP; v_table_ddl:=v_table_ddl||');'; RETURN v_table_ddl; END; $BODY$ LANGUAGE 'plpgsql' COST 100.0 SECURITY INVOKER;
以下是该函数的用法:
SELECT generate_create_table_statement('tablename');
如果您不想使此函数永久存在,请使用以下删除语句:
DROP FUNCTION generate_create_table_statement(p_table_name varchar);