文章中所有操作均是在 MySQL 5.7 版本下进行的
在创建表的时候,一些建表约束是我们经常碰到的问题,这些约束提供了更严谨和完善的建表操作,这些约束都是约束表中的列(字段)上的。
建表约束
MySQL 建表约束一共有如下几种:
- 非空约束
- 默认约束
- 主键约束
- 唯一约束
- 外键约束
- 自增长约束
非空约束(not null)
非空约束,用来修饰字段不能为空(not null)。默认情况下,字段是默认可以为空(null),我们可以通过 not null 来约束字段不能为空(not null)。如下示例:
-- 创建表的时候直接非空约束
drop table if exists tbl_test;
create table tbl_test(
id int null,
info1 varchar(50) null, -- 不设置默认为null
info2 varchar(50) not null -- 非空约束
);
-- 创建表之后修改表中的某个列为非空约束
alter table tbl_test modify column info1 varchar(50) not null;
默认约束(default)
默认约束,就是表示当我们插入记录时,如果没有传值,就会使用默认值。如下示例:
drop table if exists tbl_test;
create table tbl_test(
id int null,
info1 varchar(50) null,
info2 varchar(50) default '1' ---设置默认值为1
);
-- 创建表之后修改表中的某个列为默认约束
alter table tbl_test modify column info1 varchar(50) default '1';
主键约束(primary key)
主键约束应该是在学习和接触数据库建表的时候,最先接触到的约束。毕竟不管是学习数据库,还是应用数据库,只要涉及到表的数据存储和读取,那主键(主键约束)都是必须的。我们都知道每个表主键只有一个(不要混淆概念,这里说的主键只有一个,但是主键可以是多个列组成)。主键约束要求非空,不可重复,因为需要通过主键定位唯一一条数据(实例)。如下示例:
一个表其实是可以没有主键的,但是没有主键的表后续的程序开发那是相当难受
-- 建表的时候直接设置主键
drop table if exists tbl_test;
create table tbl_test(
id int primary key,
info1 varchar(50) null,
info2 varchar(50) null
);
-- 还可以这样
drop table if exists tbl_test;
create table tbl_test(
id int,
info1 varchar(50) null,
info2 varchar(50) null,
primary key(id)
);
-- 如果创建表的时候忘了设置主键约束
drop table if exists tbl_test;
create table tbl_test(
id int,
info1 varchar(50) null,
info2 varchar(50) null
);
alter table tbl_test add primary key(id);
-- 还可以 alter table tbl_test modify column id int primary key;
-- 另外删除主键约束 alter table tbl_test drop primary key;
-- 复合主键(联合主键)
drop table if exists tbl_test;
create table tbl_test(
id1 int,
id2 int,
info1 varchar(50) null,
info2 varchar(50) null,
primary key(id1,id2)
);
唯一约束(unique)
唯一约束,就是约束字段的值不可以重复(唯一约束的字段是可以插入 null 的)。如下示例:
-- 创建表的时候直接加入唯一约束
drop table if exists tbl_test;
create table tbl_test(
id1 int primary key,
id2 int unique, -- 直接加入唯一约束
id3 int,
info1 varchar(50) null,
info2 varchar(50) null
);
-- 还可以这样
drop table if exists tbl_test;
create table tbl_test(
id1 int primary key,
id2 int,
id3 int,
info1 varchar(50) null,
info2 varchar(50) null,
unique(id2)
);
-- 如果创建表的时候忘了设置唯一约束
drop table if exists tbl_test;
create table tbl_test(
id1 int primary key,
id2 int,
id3 int,
info1 varchar(50) null,
info2 varchar(50) null
);
alter table tbl_test add unique(id2);
-- 还可以 alter table tbl_test modify column id2 int unique;
-- 另外删除唯一约束 alter table tbl_test drop index id2;
-- 类似复合主键(联合主键)的唯一约束
drop table if exists tbl_test;
create table tbl_test(
id1 int primary key,
id2 int,
id3 int,
info1 varchar(50) null,
info2 varchar(50) null,
unique(id2,id3)
);
外键约束(foreign key … references)
外键约束是建立在两个(多个)表情况下,最基本的就是主表(父表)和副表(子表),而且外键约束是和主键约束一起来讨论的。如下示例:
-- 主表 班级表
create table tbl_class(
id int primary key, -- 主键 班级id
class_name varchar(50)
);
-- 副表 学生表
create table tbl_student(
id int primary key, -- 主键 学生id
stu_name varchar(50),
class_id int, -- 外键,所属班级的id
foreign key(class_id) references tbl_class(id)
);
/*
如果在创建副表(学生表)的时候没有创建外键,可以通过以下命令:
alter table tbl_student add foreign key(class_id) references tbl_class(id);
移除掉外键约束,可以用以下命令:
alter table tbl_student drop foreign key 外键key的名称;
外键key的名称可以通过 show create table tbl_student; 命令查看
*/
自增长约束(auto_increment)
自增长约束,就是字段的值可以自动增长,说白了插入数据时候,自增长的列不用指定自增长列的数据,MySQL 会自动生成值。自增长约束一般是和主键约束联合使用的,如下示例:
-- 创建表加入自增长
drop table if exists tbl_test;
create table tbl_test(
id1 int primary key auto_increment,
id2 int,
info1 varchar(50) null,
info2 varchar(50) null
);
-- 自增长默认是从1开始增加的,可以设置它从任何数开始,例如从20开始(谨慎)
alter table tbl_test auto_increment = 20;
MySQL 的自增长和别的数据库是有差别的,而且不同存储引擎、不同版本也有一些不同的特性。而且有的朋友也会提问,难道不能在普通的 int 类型列上使用自增长吗?!其实当你在操作普通的 int 类型列上的时候会有个错误提示,关于这个问题作者有一篇文章单独的进行了具体的分析。
结语
数据库的建表约束,可以在建表的时候起到一定的规范约束,但是这个是在数据库建表的层面上。其实平时的程序开发,不会去设置这么多复杂的约束,有时候这些约束反而会引起程序(开发阶段)报错,往往这些错误不好区分到底是程序还是数据库表上的问题。