MySQL数据库2-mysql数据约束&数据库设计的三大范式

数据约束

给表添加数据约束,从而约束用户操作表数据的行为。
1、默认值约束(default)
2、非空约束(not null)
3、唯一约束(unique)
4、主键约束(primary key)(唯一+非空)
5、自增长约束(auto_increment)
6、外键约束(foreign key)

1、默认值约束(default)

注:当前没有插入默认值字段的时候,默认值才会起作用
添加约束
  1、创建表时添加默认约束
    create table test(
       name varchar(20),
       gender varchar(2) default '男' -- 当不插入gender的时候,分配一个‘男’的默认值
    )
  2、建完表后添加默认约束
    alter table 表名 alter 列名 set default 默认值;
删除约束
  alter table 表名 alter 列名 drop default;

2、非空约束(not null)

非空约束用于保证列中所有数据不能有NULL值
添加约束
  1、直接在创建表的字段后使用 not null
    create table test(
      name varchar(20) not null,  -- name字段一定要有值(不能不插入数据,不能是null)
      gender varchar(2)
    )
  2、在创建表后使用: alter table 表名 modify 字段名 数据类型 not null;
删除约束
  alter table 表名 modify 字段名 数据类型;

3、唯一约束(unique)

唯一约束用于保证列中所有数据各不相同
注:id的值不能出现重复值。这时就要给id添加一个唯一约束。唯一约束不能约束null。
添加约束
  1、直接在创建表的字段后使用 unique
  create table test(
    id int unique,
    name varchar(20)
  )
  2、在创建表的语句后面使用 constraint 约束名 unique(字段名);
  3、在创建表后使用 alter table 表名 modify 字段名 数据类型 unique;
删除约束
  alter table 表名 drop index 字段名;

4、主键约束(primary key)(唯一+非空)

注:1、通常情况下,我们会给每张表都会设置一个主键字段,用来标记记录的唯一性
  2、建议给每张表独立添加一个叫id的字段,把这个id字段设置成主键,用来作为记录的唯一性。
添加约束
  1、直接在创建表的字段后使用 primary key
    create table test(
      id int primary key,
      name varchar(20)
    )
  2、在创建表的语句的最后面使用 constraint 约束名 primary key(字段名)
  3、在创建表后使用 alter table 表名 add constraint 约束名 primary key(字段名);
           或 alter table 表名 add primary key(字段名);
删除约束
  alter table 表名 drop primary key;

5、自增长约束(auto_increment)

必须在主键基础上自增
create table student(
  id int(4) zerofill primary key auto_increment, -- 自增长,从0开始  zerofill 零填充
  name varchar(20)
)
注:自增长字段可以不赋值,自动递增,初始值0,每次递增1(数据库维护,不需要开发者管理)
   insert into student(name) values('张三');
 不能影响自增长约束:delete from student;
 可以影响自增长约束:truncate table student;

6、外键约束(foreign key)

外键作用: 约束两种表的数据
数据会出现重复(冗余),如果数据出现冗余,那么会浪费数据库存储空间。
添加约束
  1、直接在创建表的字段后使用 references 父表名(父表主键名)
  2、在创建表的语句的最后面使用 constraint 约束名 foreign key(字段名) references 父表名(父表主键名)
    create table employee(
      id int primary key auto_increment,
      name varchar(20),
      deptid int,   -- references dept(id) -- 1
      constraint employee_dept_fk foreign key(deptid) references dept(id) -- 2
          -- 外键名称(约束名)      外键字段        参考
    )
  3、在创建表后使用 alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 父表名称(父表列名称);
删除约束
  alter table 表名 drop foreign key 外键名称;

级联技术

级联:当有了外键的时候,我们希望修改或删除数据的时候,修改或删除了主表的数据,同时能够影响父表的数据,这时就可以使用级联。 
create table employee(
  id int primary key auto_increment,
  name varchar(20),
  deptid int,
  -- 添加级联修改: on update cascade
  -- 添加级联删除: on delete cascade
  constraint employee_dept_fk foreign key(deptid) references dept(id) on update cascade on delete cascade
      --          外键名称                     外键字段  参考         
)
alter table 表名 add  constraint 约束名 foreign key(字段名) references 父表名(父表主键名) on delete set null on update cascade;  --级联删除设置为null

数据库设计

表关系

一对一:
  如:用户 和 用户详情
  一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能
  实现方式:在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)
一对多(多对一):
  如:部门 和 员工
  一个部门对应多个员工,一个员工对应一个部门
  实现方式:在多的一方建立外键,指向一的一方的主键
多对多:
  如:商品 和 订单
  一个商品对应多个订单,一个订单包含多个商品
  实现方式:建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

数据库设计的三大范式

1、第一范式: 要求表的每个字段必须独立的不可分割的单元
  学生表: student    name         --违反第一范式
          张三|狗娃
          王含|张小含
    查询: 现用名中包含‘张’的学生
    select * from student where name like '%张%';

  学生表: student  name   old_name    --符合第一范式
           张三      狗娃
           王含      张小含
2、第二范式: 在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系的。(一张表应该只表达一个意思)
  员工表:employee
    员工编号  员工姓名  部门名称   订单名称  --违反第二范式
 
  员工表:employee
    员工编号  员工姓名  部门名称       --符合第二范式
  订单表:
    订单编号  订单名称
3、第三范式: 在第二范式基础上,要求表的除主键外的字段都只能和主键有直接决定的依赖关系。    
  员工表:employee                                    --违反第三范式(出现数据冗余)
    员工编号  员工姓名  部门编号  部门名称
      1       张三    1  软件开发部
      2       李四    1  软件开发部 
  员工表:employee                                    --符合第三范式(降低数据冗余)
    员工编号  员工姓名  部门编号
      1   张三   1   
      2   李四   1   
  部门表: dept
    部门编号  部门名称
      1    软件开发部

事务

事务简介

数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
事务是一个不可分割的工作逻辑单元

-- 开启事务
  START TRANSACTION;
  或者 BEGIN;
-- 提交事务
  COMMIT;
-- 回滚事务
  ROLLBACK;

事务四大特征

原子性(Atomicity): 事务是不可分割的最小操作单位,要么同时成功,要么同时失败
一致性(Consistency) :事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation) :在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对彼此产生干扰
持久性(Durability) :事务一旦提交或回滚,它对数据库中的数据的改变就是永久的

posted @ 2019-12-26 22:26  溯鸣  阅读(172)  评论(0编辑  收藏  举报