服务一重启,数据全没。等于白干。
上一篇你跑通了人生第一个后端接口,加了三条待办,挺高兴。然后按了 Ctrl+C 重新启动——三条待办,一条不剩。
因为数据存在”内存”里。内存就是手心:能记事,洗一次手什么都没了。
今天换地方存:数据库。它是笔记本,合上、锁抽屉、明年打开,字还在。
依然是那句话:你一行代码都不用手写,也不用背任何 SQL。
一、数据库,其实就是一个”很讲究的 Excel”
你要是用过 Excel,就理解了数据库的 80%。
| Excel 里叫 | 数据库里叫 | 是什么 |
|---|---|---|
| 一个工作簿 | 数据库(Database) | 一整个文件,装很多张表 |
| 一张工作表(Sheet) | 表(Table) | 比如”用户表”“订单表” |
| 表头那一行 | 字段(Field) | 姓名、手机号、金额 |
| 下面每一行 | 记录(Record) | 张三、138xxxx、299元 |
就这么简单。 和 Excel 差在三条”讲究”:
- 它认死理:说手机号是文字,就不许塞图片。Excel 想怎么填怎么填,数据库不行。
- 它不怕大:Excel 十万行就卡,数据库百万行眼都不眨。
- 它能同时伺候很多人:十人改同一张 Excel 会打架,数据库天生为这个设计。
所以数据库 = 一个更严格、更能扛、更适合多人用的 Excel。

二、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 是最像英语的语言,念一遍就懂个大概。

三、最关键的一步:怎么设计一张表
这是整篇最值钱的部分。 写 SQL 可以交给 AI,但”这张表该有什么”得你想清楚。想不清会怎样?三个月后发现手机号没处存、改过什么没记录,然后整张表推倒重来。
每张表都必须有的三个字段
不管什么业务,闭眼先写上:
id—— 编号,自动递增。没它你没法精确定位任何一条数据。created_at—— 创建时间。没它永远统计不了”上月新增多少”。updated_at—— 更新时间。没它出问题查不出什么时候改的。
想业务字段的四个提问
- 问题一:这个东西有哪些”信息”? 以待办为例:内容、是否完成、优先级、截止日期、属于谁。
- 问题二:每个信息是什么类型? 文字
TEXT/VARCHAR、数字INTEGER、是/否BOOLEAN、钱一定用DECIMAL、时间DATETIME。 - 问题三:哪些不能为空? 待办”内容”不能为空,”截止日期”可以为空。
- 问题四:有没有默认值? 新建待办”是否完成”默认否。

四、实战:让 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的是不是写了?
这三条你能查,就超过很多刚入行的人。

五、把上一篇的接口,接上真数据库
这一步做完,你就有数据不会丢的完整应用。发给 AI:
我有一个 Node.js + Express 的待办接口,数据存在内存数组里,重启就丢。请改成用 SQLite 存储。
【我现在的代码】(贴 server.js)
【要求】
- 用 better-sqlite3(同步写法,新手好理解)
- 数据库文件 data.db 放项目根目录
- 服务启动时若表不存在就自动建表
- 四个接口逻辑不变,只把"操作数组"换成"操作数据库"
- 给我完整的 server.js,不要片段;告诉我安装命令;关键代码加注释
三句重点:
- “启动时自动建表”(不用手动敲 SQL)
- “接口逻辑不变”(前端一行不改)
- “给完整 server.js”(老规矩)
改完验证三步:
1)启动服务加两条待办;
2)Ctrl+C 停掉再重启;
3)刷新页面——那两条还在,你成了。
项目里会多出 data.db,复制走就是备份,删掉就是重来。

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

七、不会写 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 搭一个全栈小项目(实战)》,我们用一整篇从一句需求开始,把三样串成一个真东西:怎么拆清单、文件夹怎么组织、前后端数据库一条线走通、做完怎么发给别人看。那篇之后,你就能说:”这个是我做的。”