数据库知识篇
什么是增删改查CRUD
数据操作的四个基本动作
不管多复杂的应用,对数据的操作都可以归结为四个字:增、删、改、查,英文缩写 CRUD。
💡 类比:就像管理通讯录——添加新联系人、删除旧联系人、修改电话号码、查找某个人。
加载图表中...
CRUD 对应的 SQL 和 HTTP
| 操作 | SQL 语句 | HTTP 方法 | 说明 |
|---|---|---|---|
| Create 创建 | INSERT | POST | 添加新数据 |
| Read 读取 | SELECT | GET | 查询数据 |
| Update 更新 | UPDATE | PUT / PATCH | 修改数据 |
| Delete 删除 | DELETE | DELETE | 删除数据 |
Create:创建数据
-- 插入一条用户数据
INSERT INTO users (name, email, age)
VALUES ('张三', 'zhang@mail.com', 25);
-- 插入多条数据
INSERT INTO users (name, email, age) VALUES
('李四', 'li@mail.com', 30),
('王五', 'wang@mail.com', 28);
// 对应的 API 调用
await fetch("/api/users", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
name: "张三",
email: "zhang@mail.com",
age: 25,
}),
});
Read:查询数据
-- 查询所有用户
SELECT * FROM users;
-- 查询指定字段
SELECT name, email FROM users;
-- 条件查询
SELECT * FROM users WHERE age > 25;
-- 模糊查询
SELECT * FROM users WHERE name LIKE '%张%';
-- 排序
SELECT * FROM users ORDER BY created_at DESC;
-- 分页(第1页,每页10条)
SELECT * FROM users LIMIT 10 OFFSET 0;
-- 计数
SELECT COUNT(*) FROM users;
加载图表中...
// 获取用户列表
const res = await fetch("/api/users?page=1&limit=10");
const users = await res.json();
// 搜索用户
const res = await fetch("/api/users?search=张");
Update:更新数据
-- 修改指定用户的邮箱
UPDATE users
SET email = 'new@mail.com'
WHERE id = 1;
-- 修改多个字段
UPDATE users
SET name = '张三丰', age = 26
WHERE id = 1;
⚠️ 一定要加 WHERE 条件! 不加 WHERE 会更新整张表的所有数据。
// 更新用户信息
await fetch("/api/users/1", {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
email: "new@mail.com",
}),
});
Delete:删除数据
-- 删除指定用户
DELETE FROM users WHERE id = 1;
-- 删除符合条件的数据
DELETE FROM users WHERE is_active = false;
⚠️ 一定要加 WHERE 条件!
DELETE FROM users不加 WHERE 会删除所有数据!
加载图表中...
// 删除用户
await fetch("/api/users/1", {
method: "DELETE",
});
完整实战:Next.js API 路由实现 CRUD
// app/api/users/route.ts
import { pool } from "@/lib/db";
// Read — 获取所有用户
export async function GET() {
const result = await pool.query(
"SELECT * FROM users ORDER BY created_at DESC"
);
return Response.json(result.rows);
}
// Create — 创建用户
export async function POST(request: Request) {
const { name, email, age } = await request.json();
const result = await pool.query(
"INSERT INTO users (name, email, age) VALUES ($1, $2, $3) RETURNING *",
[name, email, age]
);
return Response.json(result.rows[0], { status: 201 });
}
// app/api/users/[id]/route.ts
import { pool } from "@/lib/db";
// Read — 获取单个用户
export async function GET(
request: Request,
{ params }: { params: { id: string } }
) {
const result = await pool.query(
"SELECT * FROM users WHERE id = $1", [params.id]
);
if (result.rows.length === 0) {
return Response.json({ error: "用户不存在" }, { status: 404 });
}
return Response.json(result.rows[0]);
}
// Update — 更新用户
export async function PUT(
request: Request,
{ params }: { params: { id: string } }
) {
const { name, email } = await request.json();
const result = await pool.query(
"UPDATE users SET name = $1, email = $2 WHERE id = $3 RETURNING *",
[name, email, params.id]
);
return Response.json(result.rows[0]);
}
// Delete — 删除用户
export async function DELETE(
request: Request,
{ params }: { params: { id: string } }
) {
await pool.query("DELETE FROM users WHERE id = $1", [params.id]);
return Response.json({ message: "删除成功" });
}
CRUD 操作速查表
加载图表中...
🎯 AI编程小贴士:告诉 AI"帮我用 Next.js + PostgreSQL 实现文章的增删改查 API",它会帮你生成完整的 CRUD 代码,包括数据库建表语句、API 路由和前端调用代码。
小结
- CRUD = Create(增)、Read(查)、Update(改)、Delete(删)
- 对应 SQL:
INSERT、SELECT、UPDATE、DELETE - 对应 HTTP:
POST、GET、PUT/PATCH、DELETE - UPDATE 和 DELETE 一定要加 WHERE 条件,否则影响全表
- 使用参数化查询(
$1, $2)防止 SQL 注入