MySQL 约束

99 阅读7分钟

​ MySQL 约束

一:约束简介:

1.约束概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据
-- 2.保证数据库中数据的正确性、有效性、和完整性

二:约束分类:

约束分类:                                                        关键字(!!!!!!!)
--    1.非空约束    用来限制字段的数据不能为null                              not null
--    2.唯一约束    保证该字段的所有数据都是唯一的,不重复的(用户名,密码)        unique
--    3.主键约束    主键是一行数据的唯一标识,要求非空且唯一                     primary key
--    4.默认约束    保存数据时,如果未指定该字段的值,则采用默认值                default
--    5.检查约束    保证字段值满足某一个条件                                  check
--    6.外键约束    用来让两张表的数据之间建立连接,保证数据的一致性和完整性(必须是两张表)  foreign key
-- 4.!!!约束:a:是作用于表中的字段上的,可以在建表和修改表的时候为表建立约束;:直接加在字段后面即可!!!
    --         b:一个字段可以添加多个约束,使用“  ”隔开;
--             c:直接加在字段后面即可

三:演示:

案例1:

a:根据需求完成表的创建:
-- 字段名      字段含义       字段类型          约束条件                 自己分析约束的关键字:
-- id         ID的唯一标识    Int            主键,并且自动增长          primary key auto_increment(!空格间隔!)
-- name       姓名          varchar(10)     不为空,并且唯一            not null unique
-- age        年龄           int            大于0,并且小于120          check
-- status     状态           char(1)        如果没有指定值,默认1        default
-- gender     性别           char(1)         无
-- b:创建表(也可以使用图像化界面创建表:即右键tables,new table,在框中创建勾选约束即可!!!!!!!)
--  打开sjh数据库
use sjh;
-- 创建表
create table user(
    id int primary key auto_increment comment 'ID主键',
    name varchar(10) not null unique comment '姓名' ,
    age int check (age>0&&age<=120) comment '年龄',
    status char(1) default '1' comment '状态',
    gender char(1) comment '性别'
) comment '用户表' ;
-- 插入数据
-- 注意!!!:id是自增,可以不用插入,所以我们就不要指定id值了,它会自己增加!!!;当然也可以自己填写指定;!!
insert into user(name,age,status,gender) values('kunkun',18,'好','男'),('kunkun1',19,'几','男');
-- 之后我们发现user表中已经有了两条数据,且id自动为1和2;且id字段列有一个:“黄色🔑”-->:表示主键;
insert into user(name, age, status, gender) values ('kunkun4',17,'j','男');
insert into user (id, name, age, status, gender) values (4,'kunkun3',17,'好','男');

insert into user (id, name, age, status, gender) values (4,'kunkun3',17,'好','男');
-- 1.会报错因为我们设置的name是not null unique--》:唯一约束!
-- 不能重复:因为已经有了kunkun3了,蓑衣会报错;
-- 且不能为null
insert into user ( name, age, status, gender) values ('kunkun5',123,'好','男');
-- 2.因为有“ 检查约束”,age只能在0~120之间;--保障数据正确性
insert into user ( name, age,  gender) values ('kunkun5',90,'男');
-- 3如果我们没有传入statue,会默认约束:即自动传入’1‘;

案例2:

演示外键约束:

 1.外键:外键用来让两张表的数据之间建立联系,从而保证数据的一致性和完整性;
--   2.具有外键的表成为子表,外键所关联的表称为父表。或者(主表,从表);


--   3.演示:
--     a.创建部门表:(主表/父表!!!)
use sjh;
create table dep(
    id int primary key auto_increment comment 'ID', -- id:主键约束且自增!!!
    name varchar(10) not null comment '部门名称'
) comment '部门表' ;
insert into dep(name) values ('研发部'),('市场部'),('财务部'),('销售部'),('总经办');
--   b.创建员工表(从表/子表!!!)
create table emp(
    id  int auto_increment primary key comment 'ID', -- id:主键约束自增!!
    name varchar(10) not null comment '姓名',
    age int comment '年龄',
    job varchar(20) comment '职位',
    salary int comment '薪资',
    entrydate date comment '入职时间',
    managerid int comment '直属领导',
    dapt_id int comment '部门ID' -- 关联部门表的ID!!!
) comment '员工表' ;
insert into emp(id, name, age, job, salary, entrydate, managerid, dapt_id) values (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),
                    (2,'张无忌',20,'项目经理',10000,'2005-11-01',1,1 ), (3,'张',25,'k',10000,'2005-11-05',2,1 ), (4,'无',27,'k',10000,'2005-11-11',2,1 ),
                     (5,'l',32,'k',10000,'2005-11-14',3,1 ), (6,'kun',30,'程序员',10000,'2008-11-01',2,1 );

-- 添加外键!!!:外键设在子表/从表中!!!!!!!
    -- 具有外键的表为子表,外键所关联的表为父表;!!!!


-- c.创建完两个表之后,两个表之间并没有建立起来联系关联。比如我们删掉部门表,但员工表emp中所属部门仍然存在(因为两个表没有相互关联,不影响)
--  但我们要保证数据的一致性和完整性(即dep表的变动会影响到emp表)-------->:所以我们要建立外键关联!!!!!!!!

a:添加外键

 添加外键的语法
-- (1.)创建表的时候直接添加
-- create table 表名(
-- 字段名 数据类型....
-- .....
-- [comment] [外键名称] foreign(外键字段名) references 主表(主表列名);
-- )
--
-- (2.)表创建好以后额外增加:
-- alter table 表名  add constraint 外键名称 foreign key(外键字段名) reference  主表(主表列名);
--    指定表名         添加约束       自由定义    外键 关联的字段            关联哪一个表的主键!!!
-- eg:
alter table emp add constraint fk1  foreign key (dapt_id) references dep(id);
-- 这时添加外键以后就不能删除比如:部门id,因为外键和主键相关联,相互影响!!!

b:删除外键:

3)删除外键 alter 表名 table drop foreign key fk;
alter table emp drop foreign key fk1;

三:外键更新/删除的行为:

-- no action     当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允删除/更新。 (与 RESTRICT 一致) 默认行为
-- restrict      当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。 (与 NO ACTION 一致) 默认行为
-- cascade          当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
-- set null       当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取null)。
-- set default    父表有变更时,子表将外键列设置成一个默认的值 (Innodb不支持)
-- 注意:前两个:no action,restrict是默认行为!即当我们在父表中删除/更新对应记录时, ...会自动执行;
语法:

-- alter table 表名  add constraint 外键名称 foreign key(外键字段名) reference  主表(主表列名)on update cascade on delete cascade;

-- (1).演示cascade
-- 解释1:更新:on update cascade:当我们去修改/更新父表数据的时候,首先检查该记录是否有对应的关联外键,如果有也会更新外键所在的子表中的记录!!!
alter table emp add constraint fk1  foreign key (dapt_id) references dep(id) on update cascade on delete cascade;

-- 解释2:删除:on delete cascade:当我们去删除父表的数据时,首先检查该记录是否有对应的关联外键,如果有也会删除外键所在的子表中的记录!!
-- 即当我们删除/更新dep表中(父表)中的数据时,....子表也相应的数据也会发生变化!!!!!!!!!!!!


-- (2.)演示set null
alter table emp add constraint fk1  foreign key (dapt_id) references dep(id) on update set null on delete set null ;
-- !!!创建外键的同时指定删除更新规则
-- eg:删除dep表中id为1的数据:---》:id为1的数据在dep表中被set null,且在emp表中id为1的数据条也被set null了!!!!!!!!!!!


    -- 总结:主键是一张表当中的唯一标识 :非空且唯一;如果要实现主键的自动增长(auto_increment);
    -- 一旦涉及到外键:必须是两张表,用来保证数据的完整性和正确性
    -- ---------------------------------------------------------------------------------------------
--  也可以通过图型化界面修改:右击表emp--modify table!!!!!!!!!!!!!!!