数据库知识篇

什么是增删改查CRUD

数据操作的四个基本动作

不管多复杂的应用,对数据的操作都可以归结为四个字:增、删、改、查,英文缩写 CRUD

💡 类比:就像管理通讯录——添加新联系人、删除旧联系人、修改电话号码、查找某个人。

加载图表中...

CRUD 对应的 SQL 和 HTTP

操作SQL 语句HTTP 方法说明
Create 创建INSERTPOST添加新数据
Read 读取SELECTGET查询数据
Update 更新UPDATEPUT / PATCH修改数据
Delete 删除DELETEDELETE删除数据

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:INSERTSELECTUPDATEDELETE
  • 对应 HTTP:POSTGETPUT/PATCHDELETE
  • UPDATE 和 DELETE 一定要加 WHERE 条件,否则影响全表
  • 使用参数化查询($1, $2)防止 SQL 注入