zoukankan      html  css  js  c++  java
  • mysql之外键

    一对多关系

      先定义一张部门员工表:

      把所有数据都存放于一张表有如下弊端:

      ①.组织结构不清晰;②.浪费硬盘空间;③.表的扩展性极差。

      类似于我们将所有的代码都写在用一个py文件内,在确立表与表之间的关系时,一定要换位思考(即两方都考虑周全之后才能得出结论)。

      以员工表和部门表为例:

      1.站在员工表: 看能否有多个员工对应一个部门(即:一个部门能否有多个员工),如果可以(暂时只能确定员工单向多对一部门)。

      2.站在部门表: 看能否有多个部门对应一个员工(即:一个员工能否属于多个部门),如果不可以,就能得出结论:员工表和部门表之间仅仅是单向的多对一。

      表关系中没有多对一这个说法,只有一对多(无论是多对一还是一对多都叫"一对多")

    外键(foreign key)

      如果要让两种表有代码层面上真正的关联,就必须使用外键。

      什么是外键?

        让表与表有硬性层面上的关系。外键只是建立表与表之间的联系,不是一对多特有的。

      外键约束有哪些?

        1.在创建表的时候 必须先创建被关联表

        2.插入数据的时候 也必须先插入被关联表的数据

      外键虽然能够帮你强制建立表关系,但是也会给表之间增加数据相关的约束。

      1.在修改或删除数据的时候,首先要删员工表的数据,然后才能删部门表的数据,反之会报错。

      2.级联更新级联删除。 on update cascade(同步更新);on delete cascade(同步删除)。

    多对多关系

      以图书表与作者表之间的关系为例:

      仍然站在两张表的角度:

      1.站在图书表:一本书可不可以有多个作者,可以!那就是书多对一作者

      2.站在作者表:一个作者可不可以写多本书,可以!那就是作者多对一书

      双方都能一条数据对应对方多条记录,这种关系就是多对多!

      在创建表时遇到了一个问题,即创建图书表需要有一个外键关联作者,创建作者表也需要有一个外键字段关联图书。问题来了,先创建谁都不合适,如何解决?

      解决方法: 建立第三张表,该表中有一个字段fk左表的id,还有一个字段是fk右表的id。

    一对一关系

      左表的一条记录唯一对应右表的一条记录,反之也是一样。在编写代码时,一定要用unique来确定该字段是唯一的。

      三种外键关系都是用foreign key,区别在于如何使用以及其他条件限制即可做出三种关系。

    修改表

    语法:

    1. 修改表名

      ALTER TABLE 表名;RENAME 新表名;

    2. 增加字段

      ALTER TABLE 表名

        ADD 字段名 数据类型 [完整性约束条件…],

        ADD 字段名 数据类型 [完整性约束条件…];

      ALTER TABLE 表名

        ADD 字段名 数据类型 [完整性约束条件…] FIRST;

      ALTER TABLE 表名

        ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;

    3. 删除字段

      ALTER TABLE 表名

        DROP 字段名;

    4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!

      ALTER TABLE 表名

        MODIFY 字段名 数据类型 [完整性约束条件…];

      ALTER TABLE 表名

        CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

      ALTER TABLE 表名

        CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

    复制表

      查询语句执行的结果也是一张表,可以看成虚拟表

      复制表结构+记录 (key不会复制: 主键、外键和索引)

        create table new_service select * from service;

      只复制表结构

        select * from service where 1=2; //条件为假,查不到任何记录

  • 相关阅读:
    调试代码 2017-03-13
    form表单中的encType属性
    8-2、preparedStatement(预编译声明)、时间类型、大数据(保存MP3等)、批处理(针对增删改,没有查)
    子类能否重写父类的静态方法
    多态部分:Java静态绑定与动态绑定
    DBUtils使用详细示例(参考)
    平时比较常用的Exception解决方法:(随机更新)
    8-1、JDBC对象介绍(4大参数等)
    8、JDBC入门整理
    7、Java之MySQL
  • 原文地址:https://www.cnblogs.com/blue-tea/p/11384327.html
Copyright © 2011-2022 走看看