三张表:categories(商品分类)、users(平台用户)、products(商品),实验报告里的表格就是字段设计表,包含:字段名、数据类型、是否非空、主键 / 索引、默认值、注释。
1、categories 商品分类表
表格
| 字段名 | 数据类型 | 属性约束 | 说明(为什么这么设计) |
|---|---|---|---|
| cat_id | INT UNSIGNED | PRIMARY KEY、AUTO_INCREMENT | 分类编号,无符号整数,自增主键。用自增 INT 做主键,查询快,不需要人工写 ID;UNSIGNED 只存正数。 |
| cat_name | VARCHAR(50) | NOT NULL、UNIQUE | 分类名称,字符串最长 50 字符,不能为空,不能重复。分类名不能空,不能出现两个一模一样的分类。 |
| parent_id | INT UNSIGNED | DEFAULT 0 | 父分类 ID,默认 0。实现二级分类 ,0代表一级大分类;填 cat_id 值代表属于某个父分类。 |
作用:存放商品分类,例如:0 = 数码,parent_id=1 的是手机、耳机。
2、users 用户表
表格
| 字段名 | 数据类型 | 属性约束 | 设计原因 |
|---|---|---|---|
| user_id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 用户唯一 ID,自增无符号整数,主键,每张用户记录唯一标识。 |
| username | VARCHAR(50) | NOT NULL UNIQUE | 用户名,不能为空,不能重复。登录账号,不允许两个人同名。 |
| password | VARCHAR(100) | NOT NULL | 用户密码。长度 100,存加密哈希密码(不是明文),bcrypt 加密会占 60 位,设置 100 预留空间,不能为空。 |
| phone | VARCHAR(11) | NOT NULL UNIQUE | 手机号,11 位字符串。用 VARCHAR 而不是数字:手机号开头可以 0,不要做算术运算;UNIQUE 保证手机号不能重复注册。 |
| credit_score | TINYINT | DEFAULT 100 | 用户信用分。TINYINT 范围‑128~127,足够存放 0‑100 分数;默认 100 代表新用户初始满分。 |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 注册时间。插入记录时自动填充当前系统时间,不需要程序手动写时间。 |
重点:手机号不要用 int!数字类型会丢失开头 0,也不适合手机号。TIMESTAMP 自动获取当前时间。
3、products 商品表(核心业务表)
表格
| 字段名 | 数据类型 | 约束 | 为什么这样设计 |
|---|---|---|---|
| prod_id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 商品唯一编号,主键自增。 |
| prod_name | VARCHAR(100) | NOT NULL | 商品名称,最多 100 字符,商品必须有名字。 |
| description | TEXT | 允许 NULL | 商品详情描述。TEXT 存大段长文本,商品描述可以为空。 |
| price | DECIMAL(10,2) | NOT NULL , CHECK(price>0) | 商品价格。不能用 float/double 浮点数! DECIMAL 定点小数专门存金钱,(10,2):总 10 位,小数占 2 位,最大 99999999.99;CHECK 保证价格大于 0,不能 0 元或者负数。 |
| stock_num | INT UNSIGNED | DEFAULT 1 | 库存,无符号整数,最小 0,默认库存为 1 件。 |
| cat_id | INT UNSIGNED | NOT NULL | 外键逻辑:关联 categories.cat_id。商品必须归属某一个分类,不能为空。 |
| seller_id | INT UNSIGNED | NOT NULL | 外键逻辑:关联 users.user_id,代表这个商品是谁发布(卖家用户 ID),商品必须有卖家。 |
| status | ENUM('on_sale','sold_out','removed') | DEFAULT 'on_sale' | 商品状态,只能取这三个值:on_sale 在售、sold_out 已售出、removed 下架删除。默认刚发布为在售。ENUM 限制只能填规定选项,防止乱输入状态。 |
| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 商品发布时间,插入数据自动填当前时间。 |
整体设计思想
- 主键统一设计 :每张表都设置一个无符号自增 INT 作为主键(
xxx_id),业务上不使用用户名、手机号当主键,主键使用数字,查询效率高。 - 字符集统一 utf8mb4:支持完整中文、emoji,解决中文乱码,引擎选用 InnoDB,支持事务、外键。
- 时间字段使用
TIMESTAMP DEFAULT CURRENT_TIMESTAMP:新增记录数据库自动生成时间,应用程序不用手动传入时间。 - 金钱字段必须用 DECIMAL:禁止 float,浮点数会产生精度误差。
- ENUM 状态约束:商品状态固定几种,限制输入,保证数据规范。
- 关联关系
products.cat_id关联categories.cat_id:商品属于哪个分类products.seller_id关联users.user_id:商品属于哪个卖家用户
具体步骤
阶段一:环境确认,使用 HeidiSQL 登录并切换
second_hand_market数据库
- 打开 HeidiSQL 软件,在会话管理器中,双击已经建好的 shm_user 会话连接,完成登录连接 MySQL 服务器。
步骤 1:先创建 second_hand_market 数据库
在 SQL 编辑框追加下面建库语句,全选执行 F9
-- 创建二手交易平台数据库,指定字符集utf8mb4
CREATE DATABASE IF NOT EXISTS second_hand_market
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
IF NOT EXISTS:数据库存在就不会重复创建、不会报错。

步骤 2:再执行切换数据库语句
USE second_hand_market;
SELECT DATABASE();

执行完成,下方结果返回second_hand_market,代表切换成功。
步骤 3:再执行三张业务表建表 SQL
-- 1、categories 商品分类表
CREATE TABLE IF NOT EXISTS categories (
cat_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '分类ID',
cat_name VARCHAR(50) NOT NULL UNIQUE COMMENT '分类名称',
parent_id INT UNSIGNED DEFAULT 0 COMMENT '父级ID,0表示一级分类'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品分类表';
-- 2、users 用户表
CREATE TABLE IF NOT EXISTS users (
user_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码(明文或哈希)',
phone VARCHAR(11) NOT NULL UNIQUE COMMENT '手机号',
credit_score TINYINT DEFAULT 100 COMMENT '信用分,默认100',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='平台用户表';
-- 3、products商品表
CREATE TABLE IF NOT EXISTS products (
prod_id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
prod_name VARCHAR(100) NOT NULL COMMENT '商品名称',
description TEXT COMMENT '商品描述',
price DECIMAL(10,2) NOT NULL CHECK (price > 0) COMMENT '价格,必须大于0',
stock_num INT UNSIGNED DEFAULT 1 COMMENT '库存数量',
cat_id INT UNSIGNED NOT NULL COMMENT '分类ID',
seller_id INT UNSIGNED NOT NULL COMMENT '卖家ID',
status ENUM('on_sale','sold_out','removed') DEFAULT 'on_sale' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '发布时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品表';

步骤 4:验证
SHOW DATABASES; -- 查看库列表,确认 second_hand_market 出现
SHOW TABLES; -- 查看该库下三张数据表

步骤 2:SQL 命令验证表结构(新建查询或者在当前页面末尾输入,F9 执行)
SHOW TABLES; -- 列出当前库全部表,核对3张表名称
DESCRIBE categories;
DESCRIBE users;
DESCRIBE products;
-- 查看完整建表语句,核对引擎、字符集、约束、注释
SHOW CREATE TABLE categories;
SHOW CREATE TABLE users;
SHOW CREATE TABLE products;






执行后检查:
- 存储引擎:
InnoDB - 字符集:
utf8mb4 - 主键、自增、NOT NULL、UNIQUE、DEFAULT 默认值、COMMENT 注释完整。
步骤 3:图形化界面核对每张表设计(实验要求操作)
- 左侧树,右键
categories表 →【设计】,弹出表设计窗口。
注意刷新
右键菜单,第一个选项:编辑 (H) Alt+Enter
操作
- 点击菜单最上方 编辑 (H),就打开 categories 表的表设计窗口。
- 在这里就可以查看全部字段:字段名、数据类型、无符号、主键🔑、自增、非空、默认值、注释。
- 上方切换【选项】标签页,确认引擎
InnoDB,字符集utf8mb4;切换【索引】标签页,查看主键索引。 - 看完关闭窗口,对
products、users两张表,同样右键 →编辑 (H),依次核对。

- 逐行核对:字段名、数据类型、无符号 UNSIGNED、主键、自增 AUTO‑INCREMENT、非空、默认值、注释。
- 切换【选项】标签页,确认引擎
InnoDB,字符集utf8mb4_general_ci。

3.同样操作依次打开users、products表做核对。
步骤 4(选做)创建索引
CREATE INDEX idx_username ON users(username);
CREATE INDEX idx_phone ON users(phone);
CREATE INDEX idx_cat_status ON products(cat_id, status);
CREATE INDEX idx_seller ON products(seller_id);
SHOW INDEX FROM products; -- 查看索引结果
也可以在表设计窗口【索引】选项卡看到新建索引。
步骤 5:保存 SQL 脚本
Ctrl+S保存当前查询页面,文件名实验2_二手平台建库建表.sql,完整代码留存。
可能遇见的问题:
问题 1:执行
CREATE DATABASE IF NOT EXISTS second_hand_market出现警告 1007:can't create database'second_hand_market'; database exists 分析:该警告不是错误 ,IF NOT EXISTS判断数据库已经存在,放弃重复创建,不影响后续操作。 解决:无需修改 SQL,继续执行USE second_hand_market;切换数据库即可。
问题 2:执行 CREATE TABLE 建表语句,返回 "受影响记录行数:0" 分析:CREATE TABLE 成功时,HeidiSQL/MySQL 默认返回受影响 0 行,属于正常,代表表创建完成,并非执行失败。