字段常用约束如下表:
约束 | 名称 |
---|---|
primary key | 主键 |
unique key | 唯一约束 |
null | 空约束 |
default | 默认值 |
auto_increment | 自增长约束 |
comment | 注释 |
foreign key | 外键约束 |
主键(primary key)
能唯一标识记录的字段,可以作为主键。一个表只能有一个主键。主键具有唯一性。声明字段时,用 primary key 标识。也可以在字段列表之后声明,在字段列表后声明主键时主键可以由多个字段组成,声明主键的字段值不能为null。
ex:
--创建一张名为lesson的课表设置主键是lesson_id
create table if not exists lesson(
lesson_id int not null primary key auto_increment,
name varchar(40) not null unique key comment '课名称'
)
--另一种写法方式
create temporary table if not exists lesson(
id int not null,
name varchar(40) not null comment '课程名称',
primary key(id),
unique key(name)
)
唯一约束(unique key)
使得字段的值不能重复。具有唯一性。
空约束(null)
null不是数据类型,是列的一个属性。表示当前列是否可以为空。null表示什么都没有。null意思是允许列为空。not null是不允许列为空。列的默认值为null。
ex:
--创建一张表名为student(name,age)
create temporary table if not exists student(
name varchar(20) null,
age int not null default 18
)
--向学生表中插入一条数据,此时表示将name字段的值设为null, 取决于该字段是否允许为null
replace into student set name=null,age=18;
默认值(default)
字段的默认值。
ex:
--创建一张班级表,名为clazz包含班级名,班级人数(人数默认30人)
create temporary table clazz(
name varchar(20) not null comment '班级名称',
student_num int not null default 30
);
-- 表示强制使用默认
insert into clazz values ('一年级二班', default);
--为班级表增加开班时间字段
alter table if exists clazz add column start_time timestamp default current_timestamp;
自增长约束(auto_increment)
自增长必须为索引(主键或unique),一张表中只能存在一个字段为自动增长。默认从1开始自增长。可以通过表属性 auto_increment = 初始值进行设置或 alter table tbl auto_increment = 初始值来更改自增长的初始值;
注释(comment)
表、列都可以设置注释(comment),注释就是对表、列的意思的进行解释
ex:
create temporary table if not exists teacher(
name varchar(45) not null comment '教师姓名'
)engine=innodb comment='教师信息表' charset utf8 collate utf8_general_ci;
外键约束(foreign key)
格式: foreign key(外键字段) references 主表(关联字段) [restrict|cascade|set null| no action | set default]
用于限制主表与从表数据完整性。作用:保持数据一致性,完整性,主要目的是控制存储在外键表(从表)中的数据。
ex:
-- 将表t1的t1_id外键关联到表t2的id字段。 每个外键都有一个名字,可以通过 constraint 指定存在外键的表,称之为从表(子表),外键指向的表,称之为主表(父表)。
alter table t1 add constraint t1_t2_fk foreign key (t1_id) references t2(id);
MySQL中,可以对InnoDB引擎使用外键约束:
语法:foreign key (外键字段) references 主表名 (关联字段) [主表记录删除动作] [主表记录更新动作]
此时需要检测一个从表的外键需要约束为主表的已存在的值。外键在没有关联的情况下,可以设置为null.前提是该外键列,没有not null。可以不指定主表记录更改或更新时的动作,那么此时主表的操作被拒绝。如果指定了 on update 或 on delete:在删除或更新时,有如下几个操作可以选择:
cascade,级联操作。主表数据被更新(主键值更新),从表也被更新(外键值更新)。主表记录被删除,从表相关记录也被删除。
set null,设置为null。主表数据被更新(主键值更新),从表的外键被设置为null。主表记录被删除,从表相关记录外键被设置成null。但注意,要求该外键列,没有not null属性约束。
restrict,拒绝父表删除和更新。
set default 设置为默认值,主表数据被更新(主键值更新),从表的外键被设置为默认值。主表记录被删除,从表相关记录外键被设置成默认值。但注意,要求该外键列设置default属性约束。
ps:注意,外键只被InnoDB存储引擎所支持。其他引擎是不支持的。