第64篇:用 AI 写数据库表结构与 SQL——建表语句不用背,你的数据终于活下来了

2026/09/21 AI

服务一重启,数据全没。等于白干。

上一篇你跑通了人生第一个后端接口,加了三条待办,挺高兴。然后按了 Ctrl+C 重新启动——三条待办,一条不剩。

因为数据存在”内存”里。内存就是手心:能记事,洗一次手什么都没了。

今天换地方存:数据库。它是笔记本,合上、锁抽屉、明年打开,字还在。

依然是那句话:你一行代码都不用手写,也不用背任何 SQL。


一、数据库,其实就是一个”很讲究的 Excel”

你要是用过 Excel,就理解了数据库的 80%。

Excel 里叫 数据库里叫 是什么
一个工作簿 数据库(Database) 一整个文件,装很多张表
一张工作表(Sheet) 表(Table) 比如”用户表”“订单表”
表头那一行 字段(Field) 姓名、手机号、金额
下面每一行 记录(Record) 张三、138xxxx、299元

就这么简单。 和 Excel 差在三条”讲究”:

  1. 它认死理:说手机号是文字,就不许塞图片。Excel 想怎么填怎么填,数据库不行。
  2. 它不怕大:Excel 十万行就卡,数据库百万行眼都不眨。
  3. 它能同时伺候很多人:十人改同一张 Excel 会打架,数据库天生为这个设计。

所以数据库 = 一个更严格、更能扛、更适合多人用的 Excel。

excel-vs-db


二、SQL 是什么:跟数据库说话的”外语”

数据库只听一种语言,叫 SQL(读”S-Q-L”或”sequel”)。好消息:它是所有编程相关语言里最像英语的。

SELECT * FROM todos;                    -- 选出全部,从待办表
SELECT * FROM todos WHERE done = 0;    -- 选出全部,条件是未完成
DELETE FROM todos WHERE id = 3;        -- 删掉编号 3 的那条

是不是像读蹩脚的英语说明书? 你要记的关键词就五个:

关键词 意思 对应动作
SELECT 查 GET
INSERT 增 POST
UPDATE 改 PUT
DELETE 删 DELETE
WHERE 条件是…… 定位到具体某一条

又是增删改查。 上一篇四招,这儿又出现一遍。SQL 是最像英语的语言,念一遍就懂个大概。

five-keywords


三、最关键的一步:怎么设计一张表

这是整篇最值钱的部分。 写 SQL 可以交给 AI,但”这张表该有什么”得你想清楚。想不清会怎样?三个月后发现手机号没处存、改过什么没记录,然后整张表推倒重来。

每张表都必须有的三个字段

不管什么业务,闭眼先写上:

  1. id —— 编号,自动递增。没它你没法精确定位任何一条数据。
  2. created_at —— 创建时间。没它永远统计不了”上月新增多少”。
  3. updated_at —— 更新时间。没它出问题查不出什么时候改的。

想业务字段的四个提问

  • 问题一:这个东西有哪些”信息”? 以待办为例:内容、是否完成、优先级、截止日期、属于谁。
  • 问题二:每个信息是什么类型? 文字 TEXT/VARCHAR、数字 INTEGER、是/否 BOOLEAN、钱一定用 DECIMAL、时间 DATETIME。
  • 问题三:哪些不能为空? 待办”内容”不能为空,”截止日期”可以为空。
  • 问题四:有没有默认值? 新建待办”是否完成”默认否。

design-checklist


四、实战:让 AI 生成建表语句

我们用 SQLite:不用装软件(一个 npm 包搞定)、整个数据库就是一个文件(复制即备份)、语法和 MySQL 基本一样以后换过去无痛。

把这段整段发给 AI(完整模板见文末):

我完全不懂数据库,请手把手教我。
【要建什么表】一张待办清单表,表名 todos。
【业务字段】
- 待办内容:文字,必填,最长 200 字
- 是否完成:是/否,默认「否」
- 优先级:整数 1-3,1最高,默认 2
- 截止日期:日期时间,可以为空
【通用字段】自动加 id(自增主键)、created_at、updated_at
【技术要求】用 SQLite,给完整 CREATE TABLE,每行字段加中文注释
【额外输出】1. 最常用的 6 条 SQL(增删改查+筛选+排序);2. 每条用大白话解释;3. 提醒设计上的坑。

AI 会给你类似:

CREATE TABLE todos (
  id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 编号,自动递增
  content VARCHAR(200) NOT NULL,          -- 内容,不能为空
  done INTEGER DEFAULT 0,                 -- 是否完成,0否1是
  priority INTEGER DEFAULT 2,             -- 优先级 1-3
  due_date DATETIME,                      -- 截止日期,可空
  created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
  updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

你不用看懂每个词,但能对照查三件事:

  • 字段是不是全了?
  • 该 NOT NULL 的是不是写了?
  • 该 DEFAULT 的是不是写了?

这三条你能查,就超过很多刚入行的人。

create-table


五、把上一篇的接口,接上真数据库

这一步做完,你就有数据不会丢的完整应用。发给 AI:

我有一个 Node.js + Express 的待办接口,数据存在内存数组里,重启就丢。请改成用 SQLite 存储。
【我现在的代码】(贴 server.js)
【要求】
- 用 better-sqlite3(同步写法,新手好理解)
- 数据库文件 data.db 放项目根目录
- 服务启动时若表不存在就自动建表
- 四个接口逻辑不变,只把"操作数组"换成"操作数据库"
- 给我完整的 server.js,不要片段;告诉我安装命令;关键代码加注释

三句重点:

  • “启动时自动建表”(不用手动敲 SQL)
  • “接口逻辑不变”(前端一行不改)
  • “给完整 server.js”(老规矩)

改完验证三步: 1)启动服务加两条待办; 2)Ctrl+C 停掉再重启; 3)刷新页面——那两条还在,你成了。

项目里会多出 data.db,复制走就是备份,删掉就是重来。

memory-vs-sqlite


六、五个新手最容易栽的坑

  • 坑1:WHERE 忘了写——DELETE FROM todos; 清全表!UPDATE 同理。保命习惯:先用 SELECT 同条件试跑,确认再删。
  • 坑2:用小数存钱——299.99 运算几次变 299.98999999。钱一定用 DECIMAL,或存整数”分”。
  • 坑3:一张表塞所有——把用户、订单、商品全塞一张六十字段的表。判断标准:某字段对大部分记录都空,它就不该在这张表。
  • 坑4:字段名中文或拼音——统一小写英文+下划线:user_name。混着来容易出莫名其妙的错。
  • 坑5:没备份就改结构——改表前先复制一份 data.db。一秒的事,能救你一整天。

db-pitfalls


七、不会写 SQL?让 AI 当翻译

你以后绝大多数情况是:知道要什么,但不知道 SQL 怎么写。别学语法,学怎么提问。

  • 烂提问:”帮我写个查询待办的 SQL”
  • 好提问:”表名 todos,字段 id、content、done、priority、created_at。我要查:所有未完成的,按优先级从高到低,同优先级按创建时间从早到晚,只取前 10 条。请给 SQL 并逐段解释。”

差别在好提问有三样: 表结构、具体条件、要解释。小技巧:把 CREATE TABLE 存备忘录,每次问 SQL 先粘上去,准确率翻倍。


提示词模板盒子(可直接复制)

模板 1|设计一张表(万能版)

我完全不懂数据库,请手把手教我。
【要建什么表】一张「____」表,表名 ____。
【业务字段】
- ____:类型____,是否必填____,说明____
- ____:类型____,是否必填____,说明____(列全)
【通用字段】自动加 id(自增主键)、created_at、updated_at
【技术要求】用 SQLite,给完整 CREATE TABLE,每行字段加中文注释
【额外输出】1. 最常用的 6 条 SQL;2. 每条用大白话解释;3. 指出设计上的坑。

模板 2|把内存存储改成数据库

我有一个 Node.js + Express 接口,数据存在内存数组里,重启就丢。请改成用 SQLite 存储。
【我现在的代码】(完整粘贴 server.js)
【要求】
- 用 better-sqlite3(同步写法)
- 数据库文件 data.db 放项目根目录
- 服务启动时若表不存在就自动建表
- 接口输入输出格式保持完全不变
- 给我完整的 server.js,不要片段;告诉我安装命令;关键代码加注释

模板 3|把中文需求翻译成 SQL

请帮我写一条 SQL。
【表结构】(粘贴 CREATE TABLE)
【我想查什么】用大白话描述:____(例:所有未完成的,按优先级从高到低,同优先级按创建时间从早到晚,取前10条)
【要求】1. 给可直接运行的 SQL;2. 逐段解释每部分;3. 数据量大时会慢的话,告诉我加什么索引。

速查:常用字段类型怎么选

存什么 用什么类型 注意
短文字(姓名、标题) VARCHAR(长度) 定个上限
长文字(文章、备注) TEXT 不限长度
整数(数量、优先级) INTEGER —
金额 DECIMAL(10,2) 千万别用小数型
是/否 BOOLEAN 或 0/1 SQLite 用 0/1
时间 DATETIME 配 DEFAULT CURRENT_TIMESTAMP

速查:每张表必备三字段

字段 作用 缺了会怎样
id 唯一编号,自增 没法定位单条数据
created_at 创建时间 统计不了”上月新增”
updated_at 更新时间 查不出何时改的

下篇预告

到今天你手里有三样零件:第62篇能看的网页、第63篇能传话的接口、第64篇能记事的数据库。三样都有了,但还互不认识。 下一篇《用 AI 搭一个全栈小项目(实战)》,我们用一整篇从一句需求开始,把三样串成一个真东西:怎么拆清单、文件夹怎么组织、前后端数据库一条线走通、做完怎么发给别人看。那篇之后,你就能说:”这个是我做的。”

Search

    Post Directory