day 35

1.约束
    什么是约束:  除了数据类型之外额外添加的约束
    为什么要约束: 为了保证数据的合法性 完整性
    分类:
    一.not null:
        非空约束   数据不能为空
        默认为null
        show table  t1 ;
         create table  t1(id int ,name char(10) not null )
        学生表的姓名字段


    二. default :
        默认值约束:可以指定字段的默认值
        create table  t1(id int ,name char(10) not null  default "xx");
        insert into t1(id) value(1)
        就可以不用插入名字,成功

       eg : 美柚的性别字段 默认为女 ; 游戏注册成功 送游戏币

    三. unique:
            唯一性约束 :该字段的值不能重复
            unique (key)其实是一种索引 用于提高查询效率
            一张表可以有多个唯一约束
            身份证号码 手机号 用户的学号
            create table t1(idcard char(18) unique ,name char(10) not null ,sex char(3) not null  default "" )

            单列唯一约束:
                 create table t1(idcard char(18) unique )
            多列联合唯一约束:
                 create table t1(idcard char(18),phonenumber char(11),unique(idcard,phonenumber))
                 意思; 身份证 和 手机号码 都相同 才叫相同  >>才会报错

    四. primary key ******(
        主键约束;用于唯一标识表中的一条记录
        如何能做到唯一标识  该字段 只要是唯一的 且不能为空
        也就是说主键约束 和 (非空 not null 加 唯一约束 unique ) 没有区别
        他们之间的区别是?
            唯一约束:是一种索引 必然存在于硬盘上的某个文件,是物理层面(实实在在存在的)
            primary key  是一种逻辑意义上的数据(实际不存在)
            换句话说 主键就是有 唯一约束 和 非空约束 组成的约束
           语法:
                create table  stu(stuid int primary key,name char(3));
                create table  t7(id int unique not null ,name char(3));

            有主键和没主键的区别? primary key
                  1. 无法区分两个相同的记录  比如班级里面有两个名字相同
                  2.有主键 意味着有索引 查询速度快
                  3.可以建立关联关系

        多列联合主键;
            create table  t7(id int ,name char(3),primary key(id,name));

        要不要主键?
            必须的 每个表都用该有主键 哪怕不用唯一标识 也应该考虑提升效率
            主键的字段名 几乎都叫 id

       同一个表中可不可以有多个主键?
            不可以 没有任何意义

        建议:主键的类型基本上为整型(******)


    练习:
        创建一个员工表 (员工信息: 员工编号  姓名 年龄 性别)
        create table employee values(id int primary key ,name char(10) not null,age int not null ,sex char(10) default "man");
        insert into  employee(id name age)  values(1,"jxl",18,),(2,"egon",20),(3,"lxx",18),
        问题: 可能忘记上一次的id到第几了 导致你要先看一会 影响开发效率


    五. auto_increment *******
        中文  自动增长
        作用 : 通常搭配主键字段使用 可以自动为你的数据分配主键
        如何添加;
            添加一天就自动加一 计数从1开始

        语法:
            create table t1(id int primary key auto_increment,name char(10));
            insert into t1(name) values("yyy"),("egon"),("lxx")
            insert into t1 values(null,"yyy"),(null,"egon"),(null,"lxx")
            修改自动增长其起始位置:
                alter table t1  auto_increment =3

            注意: 自动增长 只能用于整型


    六. froeign key  *******
        专门用于为表和表之间建立物理关系

在查找表之间的关系时 要站在不同表去思考:
    1.从元员工出发: 多个员工 对应一个部门
    2.从部门出发:一个部门对应多个员工
        如果两个得到的关系不同 择认为:多对一的关系是单向的

     练习一: 部门 员工(多对一)

    1. 先创建部门表:
        create table dept(id int primary key auto_increment, name char(10),manager cahr(10));
        coinsert into dept value(null,'教学部','egon')

    2.再创建员工表:
        create table emp(id int primary key auto_increment,name char(10),dept_id int ,foreign key(dept_id) references dept(id));
        insert into emp value(null ,"egon",1)

    练习二: 学员  班级  关系 (多对一)

    1. 创建班级;
    create  table class(id int primary key auto_increment ,name char(10),manager char(10));
    insert into  class value(null,"python 全栈开发","egon");
    insert into  class value(null,"linux运维开发","egon");

    2.创建学员;

    create table stud(id int primary key auto_increment ,name char(10),sex char(3),class_id int, foreign key(class_id) references class(id));
    insert into stud  value(null,"jxl",1)

    总结(注意):
        添加约束外键时:
             被关联的表需要先被创建,主表数据应该先被插入,
             部门数据(主表)用该先插入   员工数据(从表)应该后插入
             在删除数据前(主表)前 要保证该部门的员工数据都被删除了
             在更新部门编号前 先要保证没有员工关联这个部门

    问题: 外键加上以后 主表中的数据 删除 更新 都受到限制
    解决方案: 为外键添加 级联操作

    级联操作:
        指的是同步更新和删除
        语法:在创建外键时 在后面添加:
            on update cascade  :同步更新
            on delete cas.cade  :同步删除
   实例:
     班级:create table class(id int primary key auto_increment ,name char(10),manager char(10));
     学生:create table stud(id int primary key auto_increment ,name char(10),sex char(3),class_id int, foreign key(class_id) references class(id) on update casecade   on delete casecade );

多对多关系:  建立一个中间表 专门用来查询两个表的关系
    需求: 要能找出来 那些老教过那些学生 那些学生被那些老师教过
    学生表:
        create table stud(id int primary key auto_increment ,name char(10),sex char(10))
        insert into stud valu(null, "jxl","man")
     老师表:
        create table teacher(id int primary key auto_increment ,name char(10),sex char(10))
          insert into stud valu(null, "egon","man")
    中间表: 关系表
        create table t_s(t_id int ,
        s_id int ,
        froeign key(t_id) references  teacher(id),
        froeign key(s_id) references  stud(id),
        primary key(t_id,s_id)  9
        )

 

posted @ 2018-09-13 16:13  jiangxiaolong_mrx  阅读(166)  评论(0编辑  收藏  举报