5.约束
约束(constraint):在创建表的时候,给表中的字段加上一些约束,来保证表中数据的完整性、有效性!
作用:保证表中数据的有效!
分类:
列级约束
表级约束:创建表时添加在最后面的约束。(联合多个字段的约束)
约束 | 列级约束 | 表级约束 |
---|---|---|
非空约束 | not null | 无 |
唯一性约束 | unique | unique(xx,xx,..) |
主键约束 | primary key(简称PK) | primary key(xx) |
外键约束 | 无 | foreign key(字段1) references 表名(字段2) |
默认约束 | default | |
检查约束 | check(mysql不支持,oracle支持) |
二 非空约束 - not null
非空约束(not null):被约束的字段不能为null。
用法:创建表时,在字段和数据类型后面加not null关键字。
-- 示例代码
create table tb(
id int,
name varchar(20) not null # 表示name字段不能为null
);
三 唯一性约束 - unique
唯一性约束(unique):约束的字段具有唯一性不能重复(但是可以为NULL,且多个NULL不算重复)
用法:创建表时,在字段和数据类型后面加unique关键字。
-- 示例代码
create table tb(
id int unique, # 表示id字段具有唯一性(列级约束)
name varchar(20) not null
);
多个字段联合唯一性约束
用法:在创建表时,加入unique函数:unique(字段1,字段2,...)
此时的联合多个字段的约束,称为表级约束
create table tb(
id int,
name varchar(20) not null,
unique(id,name) -- id和name两个字段联合具有唯一性(表级约束)
);
#此时(1,'jack')和(2,'jerry')两条数据可以共存
注意:两个字段联合具有唯一性 和 两个字段分别具有唯一性 不同。
四 主键约束 - Primary Key (重要)
1. 相关概念:
-
主键约束:一种约束。主键值不能是NULL,同时也不能重复!
-
主键字段:添加了主键约束的字段。
-
主键值:主键字段上的值。
2. 什么是主键?
主键值是每一行记录的唯一标识。(相当于身份证号)
3. 注意:任何一张表都必须有主键!且只能有一个主键
4. 主键的特征
主键值不能是NULL,同时也不能重复!(相当于not null + unique)
5.主键的分类
-
单一主键、联合主键
-
自然主键(相当于身份证号)、业务主键(相当于在某个产品中的会员号,如银行卡号)
5. 单一主键(列级)
create table tb(
id int primary key,
name varchr(20),
);
6. 复合主键:多个字段联合起来添加主键约束。(表级)
create table tb(
id int,
name varchar(20),
primary key(id,name) -- id和name两个字段联合起来做主键
);
使用表级主键约束会给指定字段设置默认值,而列级主键不会。
实际开发中,不建议使用复合主键。
7.主键值的数据类型一般都使用数字,或者定长字符串。
8. 使用自增的方式自动维护主键 - auto_increment
create table tb(
id int primary key auto_increment, -- 主键值自增
name varchar(20)
);
auto_increment:从1自增,每次自增1 。
五 外键约束 - Foreign Key(重要)
外键约束(Foreign Key):用于维护表之间的关系,如果表中的某个字段是外键字段,那么该外键字段的值必须来源于参照表的字段。
同时,当前表和参照表就有了父子关系,参照表为父表,当前表为子表。
foreign key(字段名1) references 表名(字段名);
-
相关术语
-
外键约束:一种约束。
-
外键字段:添加了外键约束的字段。
-
外键值::外键字段中的值。
-
-
参照表的字段必须要具有唯一性(不一定是主键)
-
外键值可以为NULL
-
当前表和参照表具有父子关系之后:先创建父,再创建子;先删子,再删父。
-
参考示例
drop table if exists t_stu;
drop table if exists t_clas;
create table t_clas(
classno int primary key,
class varchar(30)
);
create table t_stu(
id int primary key auto_increment,
name varchar(20),
cno int,
foreign key(cno) references t_clas(classno)
);
insert into t_clas(classno,c) values(1904,'HAUT-zdh-1904'),(1905,'HAUT-zdh-1905');
insert into t_stu(name,cno) values('jack',1905),('jerry',1904);
-- 试图添加外键之外的值,报错
insert into t_stu(name,cno) values('yh',1901);
执行SQL脚本文件
source 路径\xxx.sql;
一般用于初始化数据库