无论是刚接触后端开发,还是需要管理项目中的数据存储,掌握在数据库中创建表是必备的基础技能。本文将以流行的关系型数据库 MySQL 为例,手把手带你完成从登录到建表、插入数据的完整流程,并深入讲解建表时的各种约束条件,帮你打下坚实的数据设计基础。
创建并使用数据库
1.1 打开命令行
连接 MySQL 服务器通常有多种方式,你可以根据实际情况选择:
- 使用图形化客户端(如 MySQL Workbench、Navicat)直接登录。
- 在 Windows 系统中,按
Win + R,输入 cmd 后回车,打开命令提示符。
- 也可以直接进入 MySQL 安装目录下的
bin 文件夹,在地址栏运行 cmd。
需要注意的是,不同的 MySQL 安装和配置方式,启动命令可能略有不同。

1.2 运行MySQL
在打开的命令行中,输入以下命令以 root 用户身份登录:
mysql -u root -p
回车后,系统会提示你输入密码。如果没有设置密码,直接再次回车即可;如果设置了密码(例如默认的 123456),输入密码后回车。

1.3 建立数据库以及表数据
成功登录后,我们就可以开始操作数据库了。
第一步,创建一个新数据库。 我们将数据库命名为 jdbc_demo:
create database jdbcdemo;
第二步,确认数据库是否创建成功。 使用 show databases; 命令可以列出当前服务器上的所有数据库,检查 jdbcdemo 是否在其中。
show databases;
第三步,使用我们刚创建的数据库。 在操作表之前,需要先指定在哪个数据库中进行:
use jdbcdemo;
第四步,创建数据表。 我们创建一个 user 表,包含 id(主键)、username(用户名)和 password(密码)三个字段:
create table user(
id int(4) not null primary key auto_increment,
username varchar(20) not null,
password varchar(10) not null
);
提示:在实际开发中,为了避免因表已存在而导致的创建失败,我们通常会在创建前先判断并删除旧表。可以使用 DROP TABLE IF EXISTS 表名; 语句,这样无论表是否存在,执行都不会报错。
一个更健壮的建表语句示例如下:
DROP TABLE IF EXISTS user; -- 如果表存在就删除
CREATE TABLE user
(
id int(4) primary key auto_increment, -- 主键ID,自增
username varchar(20) not null, -- 用户名,非空
password varchar(10) not null -- 密码,非空
);
第五步,查看表是否存在。 使用 show tables; 命令可以列出当前数据库中的所有表。
show tables;
第六步,查看表的详细结构。 使用 desc 表名; 命令可以查看表中每个字段的数据类型、约束等信息。
desc user;
第七步,向表中插入一条测试数据。
insert into user values(0,“tom”,“12”);
第八步,查询表中的所有数据,验证插入是否成功。
select * from user;
通过以上八个步骤,我们就完成了一次完整的“创建数据库 -> 建表 -> 插入数据”的操作流程。整个过程的效果如下图所示:


重要提醒:所有 SQL 语句中的标点符号(如括号、逗号、引号)都必须使用英文半角符号。
创建表时约束条件
约束是在创建表时为某一列或整个表附加的强制数据规则,用于保证数据的完整性、一致性和准确性。
创建表的基本语法结构如下:
CREATE TABLE <表名> (
<列名> <数据类型> [列级完整性约束定义]
{, <列名> <数据类型> [列级完整性约束定义]
… }
[, 表级完整性约束定义 ]
);
2.1 约束类型
常见的 数据库 约束类型包括:
- 主键 (PRIMARY KEY):唯一标识表中的每一行数据。一个表最多只能有一个主键,其值必须非空且唯一。
- 外键 (FOREIGN KEY):引用另一个表(父表)的主键,用于建立表与表之间的关联。子表中插入或修改的数据必须在父表中存在。
- 非空 (NOT NULL):该列的值不允许为
NULL。
- 唯一 (UNIQUE KEY):确保该列中的所有值都是不同的,但允许存在一个
NULL 值(视具体数据库实现而定)。
- 检查约束 (CHECK):限制列的取值范围或必须满足的条件表达式。
- 自增 (AUTO_INCREMENT):通常用于主键,当插入新记录时,该列的值会自动递增。
下面通过两个实例来理解如何应用这些约束。
【例一】创建 student 表
假设我们有如下学生信息:
| sno |
name |
sex |
age |
dep |
uid |
| 09512101 |
张三 |
男 |
18 |
计算机系 |
000001 |
| 09512102 |
李四 |
男 |
19 |
计算机系 |
000002 |
| 09512103 |
王五 |
女 |
20 |
计算机系 |
000003 |
根据业务需求,我们对每个字段设计如下约束:
| 列名 |
数据类型 |
约束 |
说明 |
| sno |
CHAR(8) |
主键 |
每个学生学号应非空且唯一 |
| name |
CHAR(10) |
非空 |
姓名信息必须要保存 |
| sex |
CHAR(2) |
检查 |
取值“男”或“女” |
| age |
INT |
检查 |
年龄在10到60岁之间 |
| dep |
VARCHAR(26) |
default |
默认值为“计算机系” |
| uid |
CHAR(18) |
唯一值 |
每个人的身份证号是唯一的 |
对应的建表 SQL 语句为:
CREATE TABLE student(
sno CHAR(8) PRIMARY KEY ,
name CHAR(10) NOT NULL ,
sex CHAR(2) CHECK(sex =‘男’ OR sex =‘女’),
age INT CHECK(age >= 10 AND age <= 60),
dep VARCHAR(26) default ‘计算机系’,
uid CHAR(18) UNIQUE
);
【例二】创建 stulesson 表(选课成绩表)
此表需要记录学生所选课程的成绩,并依赖于 student 表。
| sno |
cname |
score |
| 001 |
数据库原理 |
90 |
| 003 |
数据库原理 |
80 |
| 003 |
C语言 |
75 |
设计如下:
| 列表 |
数据类型 |
约束 |
说明 |
| sno |
CHAR(8) |
|
外键,引用 student.sno |
| cname |
CHAR(50) |
非空 |
课程名必须保存 |
| score |
INT |
检查 |
成绩在0~100之间 |
此表的主键由 sno 和 cname 共同组成(联合主键),确保一个学生的一门课程只有一个成绩记录。同时,sno 是外键,关联到 student 表。
对应的建表 SQL 语句为:
CREATE TABLE stulesson(
sno CHAR(8),
cname CHAR(50) NOT NULL,
score INT CHECK(score >=0 AND score <= 100),
PRIMARY KEY(sno, cname),
FOREIGN KEY(sno) REFERENCES student(sno)
)
2.2 其他SQL语句
除了建表,你还需要掌握一些常用的表结构修改语句:
- 删除数据库:
drop database 数据库名;
- 删除表:
drop table 表名;
- 在表末尾添加列:
Alter table 表名 add 列名 数据类型 (约束条件);
- 在表开头添加列:
Alter table 表名 add 列名 数据类型 (约束条件) first;
char 和 varchar 区别
char 和 varchar 是 SQL 中最常用的两种字符串数据类型,它们的核心区别在于存储方式和空间效率。
-
存储方式
char:定长字符串。无论实际存储的字符串多长,它都会占用预先声明的固定长度空间。例如 CHAR(10),存储“abc”时,实际会占用10个字符的空间(通常用空格填充剩余部分)。
varchar:变长字符串。它只会占用实际字符长度加上少量记录长度的额外字节。例如 VARCHAR(10),存储“abc”时,只占用约3个字符的空间。
-
空间效率与性能
char:在存储长度固定或接近固定的数据时(如身份证号、状态代码),空间利用率高,且由于长度固定,检索速度通常更快。
varchar:在存储长度变化较大的数据时(如姓名、地址、文章内容),能有效节省存储空间,但检索效率可能略低于 char。
-
适用场景
- 使用
char:适合存储长度固定或几乎固定的数据,例如手机号(11位)、国家代码(2位)、枚举代码(‘Y‘/‘N‘)。
- 使用
varchar:适合存储长度不确定、变化范围大的文本数据,例如用户昵称、商品描述、评论内容。
注意:不同数据库系统(如 MySQL, PostgreSQL, Oracle)对这两种类型的实现和细节(如最大长度、尾部空格处理)可能略有差异。例如在 Oracle 中,通常推荐使用 VARCHAR2 类型。
希望这篇详细的 MySQL 建表指南能帮助你系统地理解数据表创建的核心知识和实践步骤。掌握这些基础是设计出高效、健壮的数据结构的关键。如果你对数据库的更多高级特性或实践案例感兴趣,欢迎来 云栈社区 与我们交流探讨。