数据库完整性(二)

目录

主键约束

 自增列

默认值约束

检查约束

外键约束

级联更新/删除


主键约束

主键约束就是非空约束+唯一约束,且每个表只能有一个主键约束(表级),在多列联合的主键约束时,联合主键的值不能同时重复

主键约束关键字:primaty key.

1:在创建表时设置单列主键

扫描二维码关注公众号,回复: 14837823 查看本文章

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;

猜你喜欢

转载自blog.csdn.net/m0_65334415/article/details/128515524