python学习------9.13----约束、表之间的关联关系

约束python

 

分类:
            not null 非空约束  数据不能为空
                     学生表的姓名字段
                    create table student (id ind,name char(10) not null);

            default  默认值约束   能够指定字段的默认值
            create table user (id ind,name char(10) not null,sex char(1) default "woman");
                     美柚的性别字段 默认为女
                     游戏 注册成功 送一万金币

            unique   惟一性约束  该字段的值不能重复
                     身份证 手机号 学号
                     unique实际上是一种索引
                        索引是一种数据结构 用于提升查询效率

                     能够为空
                     一张表中能够有多个惟一约束

                     单列惟一约束
                     create table t5(idcard char(18) unique);
                     多列联合惟一约束
                     create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
                     意思: 身份证相同 而且 手机号相同 那就叫相同


            primary key  ******
                称之为主键约束
                用于惟一标识表中一条记录
                    如何能作到惟一标识 该字段 只要是唯一的 而且不为空 便可
                    也就是说 从约束的角度来看主键约束 和 非空 加 惟一约束 没有区别
                    那它们之间的区别是什么?
                    惟一约束 是一种索引 必然存在硬盘上的某个文件中  是物理层面(实实在在存在的数据)
                    primary key 是一种逻辑意义上的数据 (实际上不存在)
                    换句话说 主键 就是由 惟一约束 和非空约束 组成的约束
                    就像 一男一女 能够组成夫妻 可是夫妻只是一种称呼 不实际存在

            语法:
                create table stu (stuid int primary key,name char(3));
                create table t7(id int unique not null,name char(3));

            有主键 和没有主键的区别?
                1.没法区分两个相同记录 好比班级里有两我的名字相同
                2.有主键则意味有这索引  效率更高
                3.能够创建关联关系

             多列联合主键:
                create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));

             要不要主键?
                必须的 每一个表都应该有主键 哪怕不用惟一标识 也应该考虑提高效率
                主键的字段名 几乎都叫id
             同一个表中能够不能够有多个主键?
                不能够 没有任何意义
             主键的类型须要设置为整型,固然别的也行!建议你别这么干!


            练习
            建立一个员工表 里面存储 员工信息 员工编号 姓名 年龄 性别
            create table employee (id int primary key,name char(10) not null,age int not null,sex char(10) default "man");
            插入数据
            INSERT INTO employee VALUES(1,"杨总",20),(2,"egon",49),(3,"wxx",28);
            问题?  你极可能忘记上一次的id到第几了 致使你要先查看一下
                   麻烦影响效率  因此有了auto_increment


            auto_increment ******
                  中文  自动增加
                  做用   一般搭配主键字段使用  能够自动为你的数据分配逐渐
                    如何分配的?
                    添加一条就自动加1  计数从1开始

             语法: ******
                create table t9(id int primary key auto_increment,name char(3));

                若是主键是自动增加  你能够跳过这个字段 也能够为它插入null  均可以

                修改自动增加的起始位置  **
                alter table t9 auto_increment = 7;

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



            foreign key ******

 

 

 

 

 

mysql提供了 foreign key 专门用于为表和表之间 创建物理关联


思考 表里存储的是一条条的记录
     两个表之间能产生的关系有哪些?
        现有 A B两张表
        1.多对一
        2.一对一
        3.多对多

      在查找表之间的关系时  要分别站在 不一样表去思考
        1. 从员工出发  员工对于部门来讲 时 多个员工对应一个部门
        2. 从部门出发  一个部门对应多个员工
            若是两个获得的关系不一样 则认为 这种多对一关系是单向


      先建立部门表
      create table dept(id int primary key auto_increment,name char(10),manager char(10));
      在建立员工表
      create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));


        需求: 设计  学员表 和 班级表  五分钟练习
              两个表多对一的关系  经过外键来进行关联
              外键加在谁身上?   加到从表上
              create table class(id int primary key auto_increment,name char(10));
              create table student(id int primary key auto_increment,name char(10),c_id int,foreign key(c_id) references class(id));

        总结: 外键的做用  表与表之间创建联系
        添加外键约束时: 产生的限制
                       被关联的表须要先被建立
                       部门数据(主表)应该先插入   员工数据(从表)后插入
                       在删除部门数据前(主表)前 要保证该部门的员工数据都删除了
                       在更新部门编号前  要先保证没有员工关联到这个部门

        简单的说 外键指的是 另外一张的主键

        外键加上之后 主表中的数据 删除 和更新时 都受到限制
            解决的方案是为 外键 添加 级联操做

      

级联操做
指的是就是同步更新和删除
语法:在建立外键时 在后面添加 on update cascade 同步更新
on delete cascade 同步删除mysql

 
 

实例:
create table class(id int primary key auto_increment,name char(10));sql

 
 

create table student(
id int primary key auto_increment,
name char(10),
c_id int,
foreign key(c_id) references class(id)
on update cascade
on delete cascade
);数据结构

 
 

insert into class value(null,"python3期");
insert into student value(null,"罗傲宇",1);ui

 
 

对主表的id进行更新
以及删除某条主表记录 来验证效果spa

 

 

 

 

 

 

 

 

多对多关系的处理:
           创建一个第三方表  专门存储两个表之间的关系
           这个关系表 应该有两个字段  分别关联学生的id  和老师的id
           为了保证  数据的合法性 完整性 给这两个字段都添加外键约束
               实例:  见图2
               create table teacher (id int primary key auto_increment,name char(10));
               create table student (id int primary key auto_increment,name char(10));
               create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id)
               );

               为了不重复无用的关系数据  关系表加上关联的主键约束
               create table t_s (t_id int,
               s_id int,
               foreign key(t_id) references teacher(id),
               foreign key(s_id) references student(id),
               primary key(t_id,s_id)
               );

               insert into student value(null,"lxx");
               insert into teacher value(null,"exx");
               insert into t_s value(1,1);