在创建表的时候,我们需要对表中的某些字段加上约束(constraint),来保证这个表中数据的完整性、有效性。
常见的约束条件:非空约束、唯一性约束、主键约束、外键约束、检查约束(mysql不支持,oracle支持)。
约束条件一般在创建表的时候声明,约束条件可以同时作用在一个字段上,也可以多个字段使用相同的约束。
not null 约束的字段不允许为null,必须有值;只有列级约束,若设置多行非空,必须每行都添加非空约束条件。
语法格式:create table 表名(字段名1 字段类型,字段名2 字段类型 not null);
例:创建t_vip表,并插入数据
create table t_vip (id int,name varchar(25) not null);
insert into t_vip(id,name) values (1,"风清扬");
insert into t_vip(id,name) values (2,"令狐冲");
insert into t_vip(name) values ("任盈盈");
insert into t_vip(id) values (4);
unique约束的字段不允许重复,但是可以为null;
unique放在一个列上,是列级约束;unique放在多个列上,是表级约束。
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型 unique...);
例:创建t_vip表,并插入数据
create table t_vip (id int,name varchar(25) unique, age int);
insert into t_vip(id,name,age) values (1,"张无忌",20);
insert into t_vip(id,name,age) values (2,"赵敏",19);
insert into t_vip(id) values (3);
insert into t_vip(id,name,age) values (4,"张无忌",19);
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型,...unique(字段名2,,字段名3));
create table t_vip(id int,name varchar(25),phone varchar(20), unique(name,phone));
在mysql中,若一个字段同时被not null和unqiue约束,则该字段默认称为主键(Oracle中不适用)。此时的该字段不能为空,也不允许重复。
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型 not null unique,...);
create table t_vip (id int not null unique,name varchar(25));
主键约束术语:
主键约束:就是一种约束;
主键字段:该字段上添加了主键约束,这样的字段叫做主键字段;
主键值:主键字段中的每一个值都叫做主键值;
主键的特征:not null + unique(非空且不重复)
主键是每一行的唯一标识,没有主键的表是无效表,因为可能会有一行多多行数据完全相同。
关于主键的说明:
① 主键约束可以是列级约束,也可以是表级约束;
② 使用表级约束可以设置复合主键primary key(字段名1,字段名2…)
③ 一张表只能设置一个主键约束,但是可以多列联合起来设置为复合主键;
④ 主键数据类型:int、bigint、char等类型,一般设置为数字且是定长的。
定义:只对某一列添加主键约束
语法格式:
create table 表名(字段名1 类型 primary key,字段名2 类型...);
(列级约束)
create table 表名(字段名1 类型,字段名2 类型...,primary key(字段名));
(表级约束)
例:创建t_vip表,并插入数据
create table t_vip (id int primary key,name varchar(25), age int);
create table t_vip (id int primary key,name varchar(25), age int);
insert into t_vip(id,name,age) values (1,"张无忌",20);
insert into t_vip(id,name,age) values (2,"赵敏",19);
insert into t_vip(id) values (3);
insert into t_vip(id,name,age) values (2,"周芷若",18);
倒数第二条插入失败,因为主键id为空,最后一条插入失败,与因为主键id与表中已有的数据id相同。
定义:使用表级约束对多个列设置主键约束(只有表级约束)
语法格式:create table 表名(字段名1 类型,字段名2 类型,字段名3 类型...,primary key(字段名1,,字段名2));
例:创建sc表,并向表中插入数据
create table sc(
sno bigint not null,
cno int not null,
grade int,
primary key(sno,cno));
insert into sc(sno,cno,grade) values(201215121,1,92);
insert into sc(sno,cno,grade) values(201215121,2,85);
insert into sc(sno,cno,grade) values(201215121,1,88);
insert into sc(sno,cno,grade) values(201215122,2,90);
insert into sc(sno,cno,grade) values(201215122,3,80);
自然主键:主键值是一个自然数,和业务没关系。
语法格式:create table 表名(字段名1 类型 primary key auto_increment,字段名2 类型...));
例:创建t_vip表,并插入数据
create table t_vip(id int primary key auto_increment,name varchar(20));
向t_vip中插入数据(主键设置为自然主键,可以自增,从1开始,每次自增1)
insert into t_vip(name) values("张无忌");
insert into t_vip(name) values("周芷若");
insert into t_vip(name) values("张翠山");
insert into t_vip(name) values("殷素素");
insert into t_vip(name) values("张真人");
业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!
(业务主键实际用的少,不利于表的维护,和单一主键使用方法相同)
MySQL的外键约束用来在至少两张表之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。也就是说,设置外键约束至少要有两张表。被约束的表叫做子表,对子表进行约束的表叫做父表,子表中被约束字段中的数据的取值只能来自父表中对应的该字段数据的值,属于主从关系。
其中主表中的关联字段叫做主键,外表中的关联字段叫做外键。
外键约束作用:让表之间建立关联,减少数据冗余,使数据更加完整,关联性更强。
语法格式:create table 表名(字段名1 类型 primary key auto_increment,字段名2 类型(25),字段名3 类型...,foreign key(字段名1) references 另一张表(字段名));
注意:外键字段可以为null,外键不一定是主键,但是要被unique约束。
外键约束涉及到的相关术语:
外键约束:一种约束( foreign key)
外键字段:该字段上添加了外键约束
外键值:外键字段当中的每一个值-
例:创建t_class表(班级表),并插入数据
create table t_class(no int primary key,name varchar(20));
insert into t_class(no,name) values(1801,"软件工程1801班");
insert into t_class(no,name) values(1802,"软件工程1802班");
create table t_students(
id int primary key auto_increment,
name varchar(25),
classno int,
foreign key(classno) references t_class(no));
向表t_students中插入数据:
insert into t_students(id,name,classno) values (1001,"楚留香",1801);
insert into t_students(name,classno) values ("步惊云",1802);
insert into t_students(name,classno) values ("风清扬",1801);
insert into t_students(name,classno) values ("令狐冲",1802);
insert into t_students(name,classno) values ("小龙女",1801);
insert into t_students(name,classno) values ("张无忌",1802);
insert into t_students(name,classno) values ("楚留香",1803);
最后一行插入时,子表t_students中的classno取值不是父表t_class中的数据,插入失败。
外键在使用时可以为null,如向t_students表中插入数据。
insert into t_students(name) values ("楚留香");