MySQL用SHOW CREATE TABLE获取完整建表语句,含字符集、引擎、索引等;PostgreSQL用pg_dump -s -t;SQLite查sqlite_master表;跨库拼DDL易出错,不推荐。
MySQL 用 SHOW CREATE TABLE 最直接
想看一张表的完整建表语句,show create table 是最常用也最可靠的命令。它返回的不是抽象描述,而是能直接复用的 ddl,连字符集、存储引擎、注释、索引定义都包含在内。
常见错误是只查 DESCRIBE 或 SHOW COLUMNS,它们只给字段列表,不带约束、默认值或建表参数,没法还原结构。
- 执行
SHOW CREATE TABLE <code>user;,注意表名要加反引号(尤其含特殊字符或关键字时) - 结果第二列就是完整的
CREATE TABLE语句,复制即可用 - 如果提示
Access denied,说明权限不足——需要SELECT权限,某些旧版本还要求SHOW VIEW - 输出里可能含
/*!50100 ... */这类条件注释,这是 MySQL 版本兼容写法,保留无害,删掉也不影响执行
PostgreSQL 怎么导出 DDL:用 pg_dump 加 --schema-only
PostgreSQL 没有等价于 SHOW CREATE TABLE 的单条 SQL 命令,得靠客户端工具。最稳的方式是 pg_dump,它生成的是标准、可移植的 SQL,比手工拼接靠谱得多。
容易踩的坑是漏掉 -s(即 --schema-only),不加这个会把数据也 dump 出来,文件大、耗时长、还可能因数据量触发锁或超时。
- 基本命令:
pg_dump -s -t <code>usersmydb(-t指定表,mydb是数据库名) - 如果表在非
publicschema 下,必须写全名,比如-t <code>auth.users,否则找不到 - 输出默认含
SET和COMMENT,若只要干净建表语句,加--no-comments --no-security-labels - 注意连接权限:用户需对表有
SELECT权限,且对 schema 有USAGE权限
SQLite 查 DDL:查 sqlite_master 表就行
SQLite 把所有表结构信息存在系统表 sqlite_master 里,查它比调外部工具更快更轻量。但要注意,它只存原始 CREATE 语句,不展开 PRAGMA 设置或运行时行为。
一个典型误区是用 .schema 命令——它在 CLI 里好用,但脚本中无法直接捕获输出;而查 sqlite_master 是纯 SQL,方便自动化。
- 执行:
SELECT sql FROM sqlite_master WHERE type = 'table' AND name = '<code>logs'; - 返回结果可能为
NULL:说明表是WITHOUT ROWID或虚拟表(如 FTS),这类表的 DDL 不一定完整记录 -
sql字段内容是建表语句字符串,但不含分号,执行前建议手动补上 - 视图、索引也会出现在
sqlite_master中,务必用type = 'table'过滤,否则混在一起难定位
跨数据库通用方案:别硬写,用 information_schema 拼(慎用)
虽然各数据库都支持 information_schema,但它只提供字段、约束等碎片信息,拼 DDL 非常容易出错——比如 MySQL 的 information_schema.COLUMNS 不记录 ON UPDATE CURRENT_TIMESTAMP,PostgreSQL 的 information_schema.columns 不暴露 GENERATED ALWAYS 属性。
除非你明确知道目标数据库版本和限制,并且只要基础字段定义,否则不建议手拼。真要这么做,优先查原生元数据视图(如 MySQL 的 INFORMATION_SCHEMA.TABLES + COLUMNS + KEY_COLUMN_USAGE),而不是只靠一个表。
- MySQL 示例(仅字段):
SELECT column_name, data_type, is_nullable, column_default FROM information_schema.COLUMNS WHERE table_name = '<code>orders' AND table_schema = 'shop' ORDER BY ordinal_position; - PostgreSQL 同样字段查询需联查
pg_attribute和pg_type,复杂度陡增 - 拼出来的语句大概率缺主键、外键、索引、CHECK 约束——这些信息分散在不同系统表里,漏一项就不是完整 DDL
真正需要跨库兼容时,老实用对应数据库的原生命令或工具。DDL 不是越通用越好,而是越贴近真实执行环境越可靠。

















