建表 SQL

列定义表单一遍生成 MySQL/PostgreSQL/SQLite/Oracle 四种方言 DDL。

这个页面把一份「列定义模型」渲染成 MySQL/MariaDB、PostgreSQL、SQLite、Oracle 四种方言的 CREATE TABLE。类型映射按语义走,同一个逻辑类型在四家各落成各家的写法;输出有内联与迁移两种排版风格。方言差异不是靠「感觉」写的,每条都对着官方文档核过并在输出下方作为注释列出。反方向也能走:粘贴任一上述方言的 CREATE TABLE,用自写的容错分词器回填模型,再渲染成另一种方言;分词器尊重嵌套括号与引号,未加引号的保留字列名照原样收下,反正输出时会被引用标识符保护。

刻意不解析、并且会在界面上列出来(而不是悄悄丢掉)的子句有:CHECK 约束、分区/表空间/ROW_FORMAT 等 MySQL 表选项、索引的 USING 访问方法与列的 COLLATE、以及任何归不进「列 / 主键 / 唯一 / 普通索引 / 外键」的其它子句;跨 schema 限定名只取最后一段。不生成表空间/存储引擎专属子句、不做分区语法、不生成 GRANT 或存储过程。也完全不联网——没有 fetch、没有 XHR、没有埋点:建表工具最常被粘贴的是真实内部 schema,这里所有解析与渲染都只在浏览器内存里跑,你的表结构一步都不会离开这台设备。保留字表是各方言的精选样本、不是穷举,命中时本页会用引用标识符包裹并提示你改名。本页没有复制按钮(怕误触发把内容带进剪贴板以外的地方),下载只有一个 .sql 按钮。

建表 SQL怎么用

  • 编辑并看输出:上方表格逐列填写:列名、类型(下拉选,或切「自定义…」直接填原生类型名)、长度/精度、可空、主键、注释;自增、MySQL 的 ON UPDATE CURRENT_TIMESTAMP 与默认值收在同一行的「更多」折叠里,折叠标题用 增 / ON / 默认 三个小标记告诉你这一列开了哪几个(有任一项时默认就是展开的),行末还有 ↑ ↓ 与删。每次改动都实时刷新输出:默认只刷你选中的那一份方言,开了「并排比较」才同时刷四份;每份下方分别列出生成规则说明与本页判出的错误告警。「方言差异」折叠块列出该方言被应用的规则,逐条可核对。
  • 内联还是迁移:风格开关切换两种排版:内联把唯一约束、外键尽量写进 CREATE TABLE 表体;迁移把索引与约束拆成独立的 CREATE INDEX / ALTER TABLE ADD CONSTRAINT 语句,适合贴进版本化迁移脚本。SQLite 的外键无论如何都留在表体内(它不支持 ALTER 追加外键),工具会给出说明而不是硬拆。
  • 反向回填与告警:顶上那排模式按钮只有「生成 DDL」与「反向解析」两档,一屏只出现其中一组:切到反向解析,把现成的 CREATE TABLE 粘进文本框、点「解析并回填」,模型会被填进生成那一档的表格里再改渲染(回填后不会自动跳回去,自己点「生成 DDL」);解析按钮旁的小计实时报读回来几列、主键是哪几列、忽略了几个子句,下面逐条列出被忽略的子句与告警。红色是会导致执行失败的错误(如 MySQL 自增列未进主键、重复列名、表名为空),橙色是需要留意的告警(保留字、非 ASCII 标识符、超长类型参数、自引用/成环外键)。分词器尊重嵌套括号与引号,所以 DEFAULT (ST_PointFromText('POINT(1 1)')) 这种括号套括号的默认值、以及 COMMENT '含 ) 和 , 的注释' 都不会被切坏;未加引号的保留字列名(如 select)照原样收下,反正输出时会被引用标识符保护。
  • 可编辑的字段:可编辑的字段:列名、类型、长度/精度、是否可空、默认值、自增、MySQL 专属的 ON UPDATE CURRENT_TIMESTAMP、列注释;表级字段:表名、存储引擎、字符集、排序规则、表注释、IF NOT EXISTS、主键选择、普通/唯一索引、外键(引用表与列、ON DELETE/ON UPDATE 动作)。
  • 看几份与下几份:输出区一屏默认只摆你选的那一份方言,旁边一颗「并排比较」开关,打开才四栏并排,方便逐条对照同一段设计在各家落地时长什么样;上方还有一排方言分段按钮,切哪份就只看哪份。下载只有一个 .sql 按钮,文件里按 MySQL/MariaDB、PostgreSQL、SQLite、Oracle 的顺序各带一段、每段前有一行方言名注释,不管屏上此刻显示一份还是四份,它导出的都是四份。

常见问题

为什么同一列的自增要写成四种不同样子?

因为四家实现自增的机制根本不同。MySQL 是引擎级列属性 AUTO_INCREMENT,且要求该列是主键或唯一键(InnoDB 每表还只能有一个,违反就报 1075)。PostgreSQL 走 SQL 标准的 GENERATED ALWAYS AS IDENTITY(10+),底层是绑在列上的隐式序列,而老代码里的 SERIAL 其实是 nextval 默认值伪类型、序列与列并非生死与共。SQLite 把 INTEGER PRIMARY KEY 当成 rowid 别名来复用,再叠一个 AUTOINCREMENT 关键字才保证删过的 id 不被回收。Oracle 从 12c 起才有 GENERATED AS IDENTITY,更早只能手写序列加触发器。所以这不是语法糖的差异,是「自增到底由谁、用什么对象实现」的差异,工具按目标方言各给各的正确写法。

Oracle 为什么把我没加引号的表名变成全大写?

Oracle 对未加引号(non-quoted)的标识符做折叠:统一转成大写后再存进数据字典,所以你写 create table Orders 它记成 ORDERS,之后查询也必须按大小写不敏感的方式命中这个折叠名。代价是:一旦你哪天用双引号建了 "Orders",它就变成大小写敏感的独立对象,此后每次引用都得带双引号且大小写完全一致,否则报「表或视图不存在」(ORA-00942)。本页对 Oracle 默认加双引号以保留你输入的大小写,同时提醒:引用标识符和 VARCHAR2 的长度都受数据库字符集影响(默认按字节计),列名/表名里有中文时要格外留意超长。

MySQL 内联写 KEY、别家却要单独 CREATE INDEX,是一回事吗?

本质是同一个东西——一张二级索引——只是习惯和能力不同。MySQL 允许把普通索引(KEY/INDEX)、唯一索引直接写进 CREATE TABLE 的括号里;PostgreSQL、Oracle、SQLite 没有内联普通索引的语法,索引只能通过独立的 CREATE INDEX 语句创建,或者把唯一性写成表内的 UNIQUE 约束。所以迁移风格里本页统一把普通/唯一索引拆成 CREATE INDEX / CREATE UNIQUE INDEX,把外键拆成 ALTER TABLE ADD CONSTRAINT FOREIGN KEY(SQLite 除外,它不支持给已有表 ALTER 追加外键,只能留在建表语句内)。这只是排版习惯不同,不改变最终数据库里的索引结构。

同一个逻辑类型在不同方言里会落成什么?

类型映射按语义走:同一个逻辑 VARCHAR 在 SQLite 落成 TEXT、在 Oracle 落成 VARCHAR2,同一个 BOOLEAN 在 MySQL 落成 TINYINT(1)、在 SQLite 落成 INTEGER,整型自增在 PG 走 INTEGER、在 Oracle 走 NUMBER(10)。

注释、标识符引用与版本相关的差异怎么处理?

注释语法:MySQL 列内 COMMENT 与表尾 COMMENT= 内联;PG/Oracle 没有内联,改用独立的 COMMENT ON TABLE / COMMENT ON COLUMN;SQLite 完全没有注释语法,会被丢弃。标识符引用:MySQL 用反引号,PG/Oracle/SQLite 用双引号,未加引号时 PG 把标识符折叠成小写、Oracle 折叠成大写——这就是「Oracle 建表全是大写」的由来。版本相关的点也都点名了:IF NOT EXISTS / DROP TABLE IF EXISTS 在 Oracle 只有 23c/23ai 起才支持,19c 及更早会直接报 ORA 语法错误;Oracle 的 SQL 层在 23c 之前没有 BOOLEAN,本工具默认用 NUMBER(1) 表达布尔;SQLite 的 ALTER TABLE 只能重命名表、加列(改列类型、增删约束、删列都要重建表,删列自 3.35.0 起才原生)。

对应功能编号 #107无需安装,手机端同样可用按 Ctrl + K 换工具