# 创建表t1,字段约束说明:name:非空(not null),必须提供值;age和room:允许为null(默认可省略null关键字) create table t1( name varchar(20) not null, age varchar(20) null, room varchar(20));
# 查看表结构:Null列显示NO表示非空(name),YES表示允许为空(age、room);Default均为NULL desc t1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | | NULL | | # 非空字段,必须赋值 | age | varchar(20) | YES | | NULL | | # 可空字段,可省略赋值 | room | varchar(20) | YES | | NULL | | # 可空字段,可省略赋值 +-------+-------------+------+-----+---------+-------+
# 插入时未给非空字段name赋值 → 报错(非空字段必须提供值) insert into t1(age) values(18); ERROR 1364 (HY000): Field 'name' doesn't have a default value
# 只给非空字段name赋值,可空字段age、room省略 → 成功(省略字段自动为NULL) insert into t1(name) values('张三');
# 未给非空字段name赋值,只给可空字段赋值 → 报错 insert into t1(age,room) values(18,520); ERROR 1364 (HY000): Field 'name' doesn't have a default value
# 给非空字段name和可空字段room赋值,age省略 → 成功 insert into t1(name,room) values('张三',520);
3. 默认值(DEFAULT)
1. 默认值介绍
DEFAULT 表示字段在 没写值时自动填默认值。
2. 语法格式
1 2
列名 数据类型 [DEFAULT 默认值] age INT DEFAULT 18 # 向表中插入时没写 age,会自动补 18。如果写了值,则按自己写的为准。
# 1. 创建表t3:故意只给age设default、不给name设default,用于对比 create table t3( name varchar(20) not null, # 仅设not null,无default age int not null default 18 # 同时设not null + default );
# 查看表结构:确认约束生效 desc t3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | name | varchar(20) | NO | | NULL | | # 仅not null,Default为NULL | age | int | NO | | 18 | | # not null+default,Default为18 +-------+-------------+------+-----+---------+-------+
# 2. 实验1:插入时不指定name(仅not null无default)→ 报错 # 原因:name是not null但无默认值,未赋值时无法填充,触发非空约束 insert into t3(age) values(20); ERROR 1364 (HY000): Field 'name' doesn't have a default value
# 创建表t3,为每个字段添加comment(字段注释,说明字段含义) create table t3( id int comment '这是id编号', # 给id字段加注释 name varchar(20) comment '这是姓名', # 给name字段加注释 age int default 18 comment '这是年龄'); # 给age字段加注释(同时有默认值)
# 含义:students.class_id 必须对应 classes.id 中已有的值,不能插入不存在的班级号 create table classes ( id int primary key, name varchar(50) );
create table students ( id int primary key, name varchar(50), class_id int, foreign key (class_id) references classes(id) # 建立外键关联 );
表创建后添加外键:
1 2 3
alter table students add constraint fk_class foreign key (class_id) references classes(id);
删除外键:
1
alter table students drop foreign key fk_class;
设置级联操作(ON DELETE / ON UPDATE):
1 2 3 4 5 6 7 8 9
create table students ( id int primary key, name varchar(50), class_id int, foreign key (class_id) references classes(id) on delete cascade # 删除班级时自动删除相关学生 on update cascade # 修改班级id时自动同步学生表 );
特性
主键(PRIMARY KEY)
唯一键(UNIQUE KEY)
外键(FOREIGN KEY)
是否唯一
✅ 是
✅ 是
❌ 否(用于关联)
是否可空
❌ 否
✅ 可为空
✅ 可为空
可否多个
❌ 只能一个
✅ 可多个
✅ 可多个
用途
唯一标识行
保证字段唯一
建立表间关系
是否自动索引
✅ 自动创建
✅ 自动创建
❌ 不自动创建
依赖其他表
❌ 否
❌ 否
✅ 是
10. 小结
1 2 3 4 5 6 7 8 9 10 11 12 13
create table t9 ( id int primary key auto_increment comment '学生编号,主键且自动增长', # 主键 + 自增 + 注释 name varchar(30) not null comment '学生姓名,不能为空', # 非空约束 gender char(1) default '男' comment '性别,默认值为男', # 默认值 age tinyint unsigned default 18 comment '年龄,默认18岁', # 默认值 + 无符号 student_no char(10) unique comment '学号,唯一', # 唯一约束 class_id int comment '班级编号,对应班级表id', # 外键列 score decimal(5,2) zerofill comment '成绩,补零显示,最大999.99', # 补零效果(仅显示) enroll_date date default (current_date) comment '入学日期,默认当天', # 默认值为当前日期 foreign key (class_id) references classes(id) # 外键约束 on delete set null # 删除班级后学生class_id置空 on update cascade # 更新班级id后同步更新 ) comment='学生信息表';
约束类型
作用
是否可为空
是否唯一
可否多个
常见定义方式
常见用途与说明
NOT NULL
限制字段不能为空
❌ 否
❌ 否
✅ 可多个
age INT NOT NULL
防止出现空值,保证字段必须有内容
DEFAULT
指定默认值
✅ 可为空(若未定义)
❌ 否
✅ 可多个
age INT DEFAULT 18
插入数据未指定该字段时自动填入默认值
COMMENT
添加列或表的注释说明
✅ 可为空
❌ 否
✅ 可多个
name VARCHAR(20) COMMENT '学生姓名'
提示说明作用,不影响功能
ZEROFILL
数字显示前自动补零
✅ 可为空
❌ 否
✅ 可多个
id INT(5) ZEROFILL
仅影响显示效果,新版已弃用(推荐 LPAD())
PRIMARY KEY
主键,唯一标识表中每行数据
❌ 否
✅ 是
❌ 仅一个
id INT PRIMARY KEY / ALTER TABLE ... ADD PRIMARY KEY(id)
强制唯一且非空,可配合 AUTO_INCREMENT 使用
AUTO_INCREMENT
自动增长字段
❌ 否
✅ 是
❌ 仅一个
id INT PRIMARY KEY AUTO_INCREMENT
通常与主键一起使用,自动编号
UNIQUE KEY
唯一约束,防止重复
✅ 可为空
✅ 是
✅ 可多个
email VARCHAR(50) UNIQUE / ALTER TABLE ... ADD UNIQUE(email)