Java登陆第六天——SQL之约束

约束

约束用于确保数据库的数据满足特定的规则,多个约束可以作用于一个字段上。

在mysql中,约束一般有:
primary key(主键)
not null(非空)
unique(唯一)
foreign key(外键)

primary key(主键)

主键指定的列,它会唯一标识每一行。

主键拥有以下特性:

  • 两种指定方式:
    1. 创建表时指定:字段名 字段类型 primary key
    2. 创建表时最后写: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');

程序运行结果:
image

一张表最多只能有一个主键,但可以是复合主键

准备数据

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');

程序运行结果:
image

因为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);

程序运行结果:
image

第一条成功插入,

第二条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);

image

栗子:
在t8表中插入数据(1004,'永恩',2003)

SQL语句:

insert into t8 values (1004,'永恩',2003);

程序运行结果:
image

因为主表t7不存在2003这个id。

实际开发中,其实不推荐使用外键,因为会限制程序对数据的读写。

更多的是逻辑外键。逻辑外键:只存在逻辑之中,表结构没有声明某列为外键。

posted @ 2023-11-14 20:01  rowbed  阅读(3)  评论(0编辑  收藏  举报