MySQL用SHOW CREATE TABLE获取原始建表语句,含引擎、字符集等完整配置;PostgreSQL需pg_dump导出带注释和权限的语句;SQLite查sqlite_master表,但外键等依赖PRAGMA设置。
MySQL 中怎么拿到 CREATE TABLE 的原始语句
直接用 show create table,它返回的就是 mysql 内部实际执行过的建表语句(含默认值、引擎、字符集等细节),不是“理想化”的简化版。
常见错误是误用 DESCRIBE 或 SHOW COLUMNS,它们只列字段,不包含约束、索引、注释、存储引擎这些关键信息。
-
SHOW CREATE TABLE users;—— 最常用,结果第一列就是完整语句 - 如果表名含特殊字符或属于其他库,记得用反引号:
SHOW CREATE TABLE `my-db`.`user_log`; - 输出中
CREATE TABLE行末尾的ENGINE=InnoDB DEFAULT CHARSET=utf8mb4等,都是真实生效配置,别手动删
PostgreSQL 怎么导出带注释和权限的建表语句
pg_dump 是唯一靠谱方式,\d+ 在 psql 里只能看结构,不包含注释、所有者、GRANT 权限。
直接跑命令最稳:
-
pg_dump -s -t users mydb——-s只导结构,-t指定表名,输出即为可执行 SQL - 注释(
COMMENT ON COLUMN)、序列依赖、主键约束名都会保留,这是\d+永远不会显示的 - 如果只要单条语句,别加
--inserts或--column-inserts,否则会混入数据语句
SQLite 查看建表语句为什么总缺东西
SQLite 的 sqlite_master 表里存的是原始 CREATE TABLE 语句,但有个坑:如果你用 ORM(比如 Django、SQLAlchemy)建的表,它可能把外键、检查约束写在 PRAGMA foreign_keys = ON 后置开关里,而不是语句里。
- 查原始语句用:
SELECT sql FROM sqlite_master WHERE type='table' AND name='users'; - 但注意:
NOT NULL和DEFAULT会显示,而外键是否生效取决于PRAGMA foreign_keys当前值,语句本身不体现 - SQLite 不支持
ALTER COLUMN,所以字段注释、类型变更后,sqlite_master里的语句不会自动更新——它永远是首次创建时的样子
导出语句后发现和预期不一致,先核对这三处
不是工具问题,大概率是环境配置或权限导致的“视图偏差”。
- 字符集/排序规则:MySQL 中
SHOW CREATE TABLE返回的CHARSET和COLLATE取决于表级设置,不是数据库默认值;如果建表没显式指定,就容易误判 - 用户权限:PostgreSQL 中,低权限用户执行
pg_dump可能看不到注释或权限语句,得用 owner 用户导出才全 - 版本差异:MySQL 5.7 和 8.0 对
JSON字段的默认GENERATED语法写法不同,语句看着像“被改过”,其实是版本行为
真正麻烦的是跨引擎迁移时照搬语句——比如把 MySQL 的 AUTO_INCREMENT 直接贴到 PostgreSQL 里,连解析都过不去。原始语句只是起点,不是终点。










