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

约束

分类:
            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 同步删除


实例:
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
);


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


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

 

 

多对多关系的处理:
           建立一个第三方表  专门存储两个表之间的关系
           这个关系表 应该有两个字段  分别关联学生的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);

原文地址:https://www.cnblogs.com/Liu-guang-hui/p/9640696.html

时间: 2024-08-30 04:41:40

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

python 学习笔记 13 -- 常用的时间模块之time

Python 没有包含对应日期和时间的内置类型,不过提供了3个相应的模块,可以采用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包含一些函数用于获取时钟时间和处理器的运行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口.datetime 中的类支持算术.比较和时区配置. *    calendar 模块可以创建周.月和年的格式化表示.它还可以用来计算重复事件.给定日期是星期几,以及其他基

python 学习笔记 13 -- 经常使用的时间模块之time

Python 没有包括相应日期和时间的内置类型.只是提供了3个相应的模块,能够採用多种表示管理日期和时间值: *    time 模块由底层C库提供与时间相关的函数.它包括一些函数用于获取时钟时间和处理器的执行时间,还提供了基本解析和字符串格式化工具 *    datetime 模块为日期.时间以及日期时间值提供一个更高层接口. datetime 中的类支持算术.比較和时区配置. *    calendar 模块能够创建周.月和年的格式化表示. 它还能够用来计算反复事件.给定日期是星期几,以及其

Python 学习笔记13:Python + wsgi + django 配置。坑爹的python3和wsgi不兼容的解决

今人不见古时月,今月曾经照古人.生命是如此的美丽与短暂! 学习Python已经两个月了,Python的语法通过做简单的语法题和看Python语法介绍,有了初步的了解.但上班还是要做别的事情,所以感觉学起来特别慢.有一种时不我待的感觉. 基本的语法了解了,接下来就要尽快进入到项目的实战.这样才能快速的遇到问题,并解决问题,迅速提升能力. 开始当然就是先按网上的一般步骤,用django写个博客网站出来. 接下来就是血泪啊!配置这个Python + wsgi + django, 其恶心已达到足以让我呕

Python学习---Django误删除sql表后,如何创建数据

误删除sql表后,怎么创建数据? 仅仅适合单表,多表因为涉及约束, python mangage.py makemigrations  --> 生成migrations目录和根数据库对应的sql python mangage.py migrate         --> 同步数据到数据库内 python mangage.py migrate --fake    --> 不同步数据到数据库内 原文地址:https://www.cnblogs.com/ftl1012/p/9417319.ht

Python学习笔记13:标准库之子进程(subprocess包)

ubprocess包主要功能是执行外部的命令和程序.从这个意义上来说,subprocess的功能与shell类似. subprocess以及常用的封装函数 当我们运行python的时候,我们都是在创建并运行一个进程. 在Python中,我们通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序. subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所以我们可以根据需要来从中选取一个使用. 另外subprocess还提供了一些管理标准流(

Python学习(13)函数

目录 Python 函数 函数调用 匿名函数 return语句 变量作用域 Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数. 定义一个函数 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆

Python学习:13.Python正则表达式

一.正则表达式简介 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言, (在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被 编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模

Python学习总结13:os模块

os模块包含普遍的操作系统功能,与具体的平台无关.常用于处理文件和目录这些我们日常手动需要做的操作. 1. os模块函数汇总 1) os.name():判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'     2) os.getcwd():得到当前工作的目录.     3) os.listdir():指定所有目录下所有的文件和目录名.         以列表的形式全部列举出来,其中没有区分目录和文件.     4) os.remove():删除指定文件  

Python学习笔记13(异常处理)

搬运自:http://www.cnblogs.com/wupeiqi/articles/5017742.html 1.异常基础 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! try: pass except Exception as ex: pass 2.异常种类 python中的异常种类非常多,每个异常专门用于处理某一项异常!!! AttributeError 试图访问一个对象没有的树形,比如foo.x