Mysql数据库约束和三大范式

 show databases;
        use db;
        show tables;
        select * from stu;
        -- 约束 : 主键约束 primary key   非空且唯一
        -- 非空约束 not null  
        -- 唯一约束 unique 
         -- 外键约束 foreign key
        create table stu2 (id int primary key, name varchar(20) not null,address varchar(77));
        select * from stu2;
        insert into stu2 values ( 1, "liang","biejing");
        -- 修改表中的约束
        alter table stu2 modify address varchar(20) unique;
        select * from stu2;
        insert into stu2 values (2,"shu","beijing");
        select * from  stu2;
        insert into stu2 values (3,"cheng", "shanghai");
        select * from  stu2;
        -- 删除 唯一约束 不能使用modify
        alter table stu2 drop  index address;
        -- 再创建表之后添加唯一约束alter
        alter table stu2 modify address varchar(20) unique;
        -- 删除主键
        alter table stu2 drop primary key ;
        -- 在创建表之后添加主键
        alter table stu2 modify id int primary key;
        -- 实现自动增长
        alter table stu2 modify id int primary key auto_increment;
        insert into  stu2  values ( null,"python","nihao") ;
        select * from stu2;
        show create table stu2;
        -- 外键约束
        -- 创建部门表(id,dep_name,dep_location) -- 一方,主表 
        create table department(  id int primary key auto_increment,  dep_name varchar(20),  dep_location varchar(20) ); 

        -- 创建员工表(id,name,age,dep_id) -- 多方,从表 
        create table employee(  id int primary key auto_increment,  name varchar(20),  age int,  dep_id int ,
        constraint emp_dept_fk foreign key (dep_id) references department(id));

        -- 添加2个部门
         insert into department values(null, '研发部','广州'),
         (null, '销售部', '深圳'); select * from department; 

        -- 添加员工,dep_id表示员工所在的部门 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1); 
         INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
        INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2); 
         select *from employee;
         drop table employee;
         drop table department;
        select * from employee;
        select  *from department;
        alter  table employee drop foreign key emp_dept_fk;
        -- 添加外键 一对多的时候 员工和部门之间就是 多对一的关系 我们在多的一地方放置一的主键 作为外键 
        -- 并且设置级联操作
        alter table employee add constraint  hhh_em  foreign key (dep_id) references department(id) on update cascade on delete cascade;

数据库设计

表之间的关系

1.  一对一的关系:人和身份证之间的关系
    吧
     处理方式 :可以再任意一方添加外键, 我个人认为 完全可以用一张表来表示 ,并且使得这个外键唯一约束 unique 

2.   一对多的关系  :例如员工和部门之间的关系 ,  一个员工对应一个部门 , 一个部门可以的对应个员我们在设计表的时候** 再多的一放建立外键 放置一的一放的主键 让他们产生关联*

    constraint 外键名 foreign key (从表的主键) references departement(主表的主键);

3. 多对多的关系: 例子:学生和课程之间 就是多对多的关系, 我们通过建立联合主键的方式, (也就是建立第三张表 里面放置对方的主键 )

数据库设计的范式

    ## 第一范式 ##
    1. 每一列都是不可分割的原子项数据(列是唯一的 不存在两个列,不是符合列
    2. 存在的问题:数据冗余重复的太多了 ,数据添加和删除 会产生不合法的数据
    ----------
    ## 第二范式 ## 
        ###     在1NF的基础上 非属性码 必须完全依赖于候选码(消除非主属性对主码的部分函数依赖)消除部分依赖  ###
    1. 函数依赖:如果A--> B 如果通过A的属性推倒出唯一的B 就说B依赖于A;学号——> 姓名

    2. 完全函数依赖: (学号, 课程名称)--> 分数  前面的就是一个属性组
        A---> B A是一个属性组则 B属性推倒确定需要依据A中属性组的所有d的属性值 

    3.部分函数依赖:属性组中的某一个属性组可以确定B属性的的值---A(学号, 课程名称)--> B分数

    4. 传递函数依赖: A——>B  B-->C 就可以说C传递函数与A;
        学号————>院系名-->  院长
    5.码:属性或者属性组 被其他属性完全依赖, 就说这个属性(属性组) 为该表的码
    ----------

    ## 第三范式 ##(**消除传递依赖**)

    ----------

 

Mysql数据库约束和三大范式_第1张图片

 如图所示:1NF解决的是:保证列的原子性  保证没有复合列 就变成了如下的表格

Mysql数据库约束和三大范式_第2张图片

 如图上图所示: 2NF是为了消除部分函数依赖

Mysql数据库约束和三大范式_第3张图片

 如图所示:3NF是为了消除传递依赖

Mysql数据库约束和三大范式_第4张图片

 

你可能感兴趣的:(DATABASE)