目录
主键约束
主键约束就是非空约束+唯一约束,且每个表只能有一个主键约束(表级),在多列联合的主键约束时,联合主键的值不能同时重复
主键约束关键字:primaty key.
1:在创建表时设置单列主键
create table <表名>(
属性名 数据类型 primary key, #设置主键
属性名 数据类型 not null )
2:设置多个属性为联合主键
alter table<表名> add [constraint <约束名>] primary key(属性1[,属性2,....,属性n]);
3、删除主键约束
alter table<表名> drop primary key; #直接丢掉主键
#主键约束primary key (表级约束)
-- 主键约束就是非空约束+唯一约束,非空且唯一,用于规定实体完整性,唯一标识元组
-- 如果一个数据表中没有主键,那么第一个非空且唯一的属性会自动成为主键
-- 同一个数据表中非空且唯一的属性可以有多个,但是主键只能有一个(有且仅有一个)
-- 创建一个数据表,使表中某个属性成为主键
create table staff( -- 员工表
staff_id int primary key, -- 工号(主键)
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4),-- 员工性别
staff_age int
-- primary key(staff_id) -- 添加主键约束
);
-- 以修改表结构的方式为某个属性添加主键约束
alter table staff add primary key(staff_id);
delete from staff where staff_id = 2 and staff_name is null;
-- 以修改表结构的方式去掉某个属性的主键约束
alter table staff drop primary key;
-- 联合主键(非空约束+复合唯一约束)
-- 数据表中可能存在多个属性同时作为一个主键的情况,也就是一个主键包含多个属性
-- 多列作为联合主键,其主键的取值不能为空,且不能同时重复
-- 以修改表结构的方式为多个属性添加联合主键约束
alter table staff add primary key(staff_id,staff_name);
-- 如果属性的取值已经存在空值或者重复值,就不允许为这个属性添加主键约束
desc staff;
自增列
自增列就是在插入数据时,如果不规定属性的值,其值就会根据上一个属性的值自动加1.
自增列关键字:auto_increment (行级约束)
1、创建表时添加自增列
create table <表名> (
id int primary key auto_increment, # 将id设置为自增列 );
2、添加自增列
alter table <表名> modify column <属性名> <数据类型>
auto_increment = 100; #可以设置自增列的初始值 (默认值为1)
3、删除自增列
alter table <表名> modify column <属性名> <数据类型>;
#自增列约束auto_incerment (行级约束)
-- 对添加了自增列约束的属性,如果不给定属性的取值,它会自动根据上一个属性的取值+1
-- 给一个属性添加自增列时,需要这个属性已经有唯一性质的约束,一般只为主键约束添加自增
-- 创建一个数据表,使表中的某个属性成为主键,并且添加自增列
create table staff(-- 员工表
staff_id int primary key auto_increment, -- 工号(主键,自增)
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4),-- 员工性别
staff_age int
-- primary key (staff_id) -- 添加主键约束
)auto_increment = 100; -- 给定自增列的起始值 (起始值默认为1)
-- 以修改表结构的方式为某个属性添加自增列约束
alter table staff modify column staff_id int auto_increment;
-- 以修改表结构的方式为某个属性添加唯一约束
alter table staff add unique(staff_id);
-- 如果表中没有主键,第一个非空且唯一的属性会自动成为主键
insert into staff(staff_name) values("小明");
-- 以修改表结构的方式删除某个属性的自增列约束
alter table staff modify column staff_id int;
desc staff;
默认值约束
给带有默认值约束的属性添加数据时,如果没有给定属性值,会自动添加一个默认值
默认值约束关键字:default
1、在创建表时设置默认值约束
create table <表名> ( name varchar (20) not null,
sex varchar(2) default '男’); #性别默认为'男'
2、添加/删除默认值约束
alter table <表名> modify column <属性名> <属性类型> [default<默认值>];
默认值约束default(行级约束)
-- 插入数据时如果不给定属性的取值,那么带有默认值约束的属性会自动使用给定的默认值
-- 创建一个数据表,设置某个属性的默认值
create table staff(-- 员工表
staff_id int, -- 工号
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4) default '男', -- 员工性别(默认为男)
staff_age int
);
-- 以修改表结构的方式为某个属性添加默认值约束
alter table staff modify column staff_gender varchar(4) default '男';
insert into staff(staff_id,staff_name) values(4,"王五");
-- 以修改表结构的方式删除某个属性的默认值约束
alter table staff modify column staff_gender varchar (4);
desc staff;
检查约束
检查约束就是检查列中属性的取值范围,判断字段的值是否为指定的值,如果不是就不允许数据的插入或修改。
检查约束关键字:check
如:
age int check (age>=0 and age=<150),
#约束年龄的取值范围为0~150之间
sex varchar(2) check (sex='男' or sex='女’)
#约束性别的取值范围为'男’或’女’
#注意:MySQL不支持检查约束,需要在外部进行判断
检查约束check(行级约束)
-- 检查约束用于规定和限制属性的取值范围
-- 创建一个数据表,设置某个属性的取值范围
create table staff( -- 员工表
staff_id int, -- 工号
staff_name varchar(30), -- 员工姓名
staff_gender varchar(4) check(staff_gender = "男" or staff_gender = "女"),-- 员工性别
staff_age int check (staff_age >=0 && staff_age <= 100)
);
-- 以修改表结构的方式为某个属性添加检查约束
alter table staff add constraint check_gender check(staff_gender = "男" or staff_gender = "女");
insert into staff (staff_id,staff_name,staff_gender)values(5,"赵六","男");
desc staff;
外键约束
外键约束是指一个表中的属性值参考另一个表中的主属性值,也就是外键值参考主键值,由于外键约束是表级约束,所以在创建参考表之前要先创建被参考表
1、创建表时建立外键约束
constraint <约束名> foreign key(<属性名>) references 被参考表(<被参考属性名>)
2、添加外键约束
alter table <表名> add constraint <约束名> foreign key (<属性名>) references 被参考表(<被参考属性名>);
3、删除外键约束
alter table <表名> drop constraint <约束名>;
#根据约束名删除约束
##外键约束foreign key(表级约束)
-- 外键约束用于描述两个实体集之间的联系
-- 外键约束用于表示参考完整性,外键值参考主键值
-- 在创建外键所在的参考表之前,需要先创建被参考表
-- 在创建员工表之前,需要创建被参考表(父表) :部门表
create table department_tb( -- 部门表
d_id int primary key auto_increment, -- 部门编号
d_name varchar(20) not null, -- 部门名称
d_number int default 0 -- 部门员工人数
)auto_increment = 100;
-- 部门表数据的插入
insert into department_tb(d_name) values("人事部"),
("行政部"),("财务部"),("销售部"),("生产部");
-- 创建员工表
create table staff_tb( -- 员工表
staff_id int primary key auto_increment, -- 工号
staff_name varchar(30) not null, -- 员工姓名
staff_did int, -- 部门编号(外键,参考于部门表里的部门编号)
staff_gender carchar(4) check(staff_gender = "男" or staff_gender = "女"),-- 员工性别
staff_age int check(staff_age >= 0 && staff_age <= 100),
constraint for_sdid foreign key(staff_did) references department_tb(d_id) -- 外键约束
)auto_increment = 1000;
-- 插入员工信息(正确的测试数据)
insert into staff_tb(staff_name,staff_did,staff_gender,staff_age)
values("小芳",102,"女",25);
-- 插入员工信息(测试外键约束)
insert into staff_tb(staff_name,staff_did,staff_gender,staff_age)
values("小刚",105,"男",26);
delete from department_tb where d_id = 102;
级联更新/删除
级联更新/删除是指父辈中的元祖更新或删除等操作对子表的处理方式,
其中有三种处理方法:
#在更新/删除中(on update/on delete)
-- 1、cascade: 父表中的元祖更新或删除,在子表中跟着更新或者删除
#在外键约束后加上:on update cascade/on delete cascade
-- 2、no action : 无动作,若子表中有匹配的记录,就不允许更新/删除父表的数据
#在外键后加上:on update no action/on delete no action
-- 3、set null : 设置为空,若子表中有匹配的记录,更新/删除父表中的数据,子表中对应数 据 设置为空
#在外键约束后加上: on update set null/on delete set null
-- 创建员工表,并规定外键以及级联更新/删除
create table staff_tb( -- 员工表
staff_id int primary key auto_increment, -- 工号
staff_name varchar(30) not null, -- 员工姓名
staff_did int, -- 部门编号(外键,参考于部门表里的部门编号)
staff_gender carchar(4) check(staff_gender = "男" or staff_gender = "女"),-- 员工性别
staff_age int check(staff_age >= 0 && staff_age <= 100),
constraint for_sdid foreign key(staff_did) references department_tb(d_id) -- 外键约束
on update cascade on delete set null -- 设置外键的级联更新/删除
-- on update set null -- 仅仅设置级联更新
-- on delete cascade -- 仅仅设置级联删除
-- 默认级联更新/删除的处理方式为no action(不允许)
)auto_increment = 1000;
-- 查看表约束
desc staff_tb;