Java登陆第六天——SQL之约束
约束
约束用于确保数据库的数据满足特定的规则,多个约束可以作用于一个字段上。
在mysql中,约束一般有:
primary key(主键)
not null(非空)
unique(唯一)
foreign key(外键)
primary key(主键)
主键指定的列,它会唯一标识每一行。
主键拥有以下特性:
- 两种指定方式:
- 创建表时指定:字段名 字段类型 primary key
- 创建表时最后写:primary key(列名)
- 主键不能重复且不能为null。
- 一张表最多只能有一个主键,但可以是复合主键
两种指定方式
主键的两种声明方式。
--第一种,创建表时指定
create table t3(
id int primary key,
name varchar(50),
email varchar(50)
);
--第一种,创建表时最后写
create table t4(
id int,
name varchar(50),
email varchar(50),
primary key(id)
);
主键不能重复且不能为null
顾名思义,约束为主键的列,它的行不能重复且不能为null。
准备数据
--id被指定为主键。
create table t1(
id int primary key,
name varchar(50),
email varchar(50)
);
insert into t1 values(1,'阿卡丽','akali@asd.com');
insert into t1 values(2,'手机壳','shoujike@aqwe.com');
栗子:
在t1表中插入数据(1,'大树','dsax@asdas.com')
在t1表中插入数据(null,'莫伊','asd@dqwe.com')
SQL语句:
insert into t1 values(1,'大树','dsax@asdas.com');
insert into t1 values(null,'莫伊','asd@dqwe.com');
程序运行结果:
一张表最多只能有一个主键,但可以是复合主键
准备数据
create table t2(
id int primary key,
name varchar(50) primary key,
email varchar(50)
);
--ERROR 1068 (42000): Multiple primary key defined
--复合主键要使用第二种声明方式
create table t2(
id int,
name varchar(50),
email varchar(50),
primary key(id,name)
);
insert into t2 values(1,'阿卡丽','akali@asd.com');
insert into t2 values(2,'手机壳','shoujike@aqwe.com');
栗子:
在t2表中插入数据(1,'大树','dsax@asdas.com')
在t2表中插入数据(1,'阿卡丽','qwe@safsa.com')
SQL语句:
insert into t2 values(1,'大树','dsax@asdas.com');
insert into t2 values(1,'阿卡丽','qwe@safsa.com');
程序运行结果:
因为t2表中主键是由id+name组成的复合主键,所以第二条语句无法执行。
not null(非空)和unique(唯一)
顾名思义,not null声明的列不能为null。unique声明的列,其行是唯一的,不可重复的。
非空拥有以下特性:
not null指定的列,行不能为null。
唯一拥有以下特性:
unique指定的列,行不能重复。
行可以为null,如果该列没有被not null约束,可以有多个null。
准备数据
create table t5(
id int primary key,
name varchar(50) unique not null,
email varchar(50) unique
);
insert into t5 values(1,'大树','dsax@asdas.com');
insert into t5 values(2,'阿卡丽','qwe@safsa.com');
栗子:
在t5表中插入数据(3,'明烛',null)
在t5表中插入数据(4,'大树','qwe@saf.com')
在t5表中插入数据(5,null,null)
在t5表中插入数据(6,'玻璃杯',null)
SQL语句:
insert into t5 values(3,'明烛',null);
insert into t5 values(4,'大树','qwe@saf.com');
insert into t5 values(5,null,null);
insert into t5 values(6,'玻璃杯',null);
程序运行结果:
第一条成功插入,
第二条name相同,
第三条name为null,
第四条成功插入,因为unique可以为null,且email没有被not null约束,可以有多个null。
foreign key(外键)
外键经常是两张表中出现,一张叫主表,一张叫从表。
从表中,外键声明的列,必须存在主表之中或null。(且主表中的列必须是主键或者unique)
外键声明的列数据类型也须与主表某列相同。
--声明方式
create table(
...
foreign key(外键字段名) references 主表名(主键字段或unique字段)
)
准备数据
--老师表
create table t7(
id int primary key,
name varchar(20)
);
--学生表
create table t8(
id int primary key,
name varchar(20),
t_id int,
foreign key(t_id) references t7(id)
);
insert into t7 values (2001,'鞍山道将');
insert into t7 values (2002,'撒豆巨人');
insert into t8 values (1001,'雷克顿',2001);
insert into t8 values (1002,'雷瑟斯',2002);
insert into t8 values (1003,'贾克斯',null);
栗子:
在t8表中插入数据(1004,'永恩',2003)
SQL语句:
insert into t8 values (1004,'永恩',2003);
程序运行结果:
因为主表t7不存在2003这个id。
实际开发中,其实不推荐使用外键,因为会限制程序对数据的读写。
更多的是逻辑外键。逻辑外键:只存在逻辑之中,表结构没有声明某列为外键。