zoukankan      html  css  js  c++  java
  • mysql的外键?

    关于mysql的外键约束, 这个是必须的,必须要设置! 是为了保证整个数据库的数据的完整性.

    • 在 设置表的约束, 索引, 外键等, 在创建表的时候设置, 和 在创建表完成后再设置, 它们的命令语句是不同的, 甚至命令的动词关键字或名词关键字都是不一样的
    • 在设置了外键 约束后, 在查询的时候, 也并不麻烦. 可以同时 在多个表中 取数据, 就是所谓的 多表(通常是两个表) "连接查询 或叫做 联合查询"
      join查询有四种情况, 包括 inner join, left join, right join, full join. 其实常用的就是 inner join, 也就是 常用的 连接查询 select ... from t1, t2 where...
      最普通最常用的 多表 联合/连接查询就是: select tbl1.f1, tbl1.f2, tbl2.f3, tbl2.f4 .. from tbl1, tbl2 where tbl1.id = tbl2.id 类似的
      join连接和普通连接的区别是: 前者的from中用的是 inner/left join ..., 后者用的是逗号; 第二, 前者的条件分句用的是on ..., 后者用的是 where...
      比如: select 左表.f1, ...., 右表.f5,.... from 左表 inner/left/right/full join 右表 on 左表.id = 右表. foreignkey_id
      最常用的两表联合查询还是用 的 普通连接查询语句, 只有在特殊情况下, 采用join查
      join查询中 结果集的排序顺序还是 以左表为准, 其次先列出 on分句中满足相等条件的记录, 然后是 不满足相等条件的左表记录, 最后才是 不满足相等条件的右表记录,

    ===============================

    创建外键定义服从下列情况:(前提条件)

    1. 所有tables必须是InnoDB型,它们不能是临时表.因为在MySQL中只有InnoDB类型的表才支持外键.
    2. 所有要建立外键的字段必须建立索引.
    3. 对于非InnoDB表,FOREIGN KEY子句会被忽略掉。 参考: https://blog.csdn.net/liqinghuan_blog/article/details/29214659

    子表 的 外键有 参考一个父表的 一个字段, 也有双外键, 即: 参考 一个父表中的 多个字段的

    -- 双外键 
    create table son_table(....
    INDEX (product_category, product_id), 
    FOREIGN KEY (product_category, product_id) 
    REFERENCES product(category, id) 
    ON UPDATE CASCADE ON DELETE RESTRICT, 
    -- 单外键 
    INDEX (customer_id), 
    FOREIGN KEY (customer_id)
    REFERENCES customer(id)) TYPE=INNODB;
    

    关于外键中的生效方式:
    两种动作下的 外键生效方式: 一是 update, 一是 delete. 有四个值: cascade(字表跟着父表在update/delete的时候级联动作), set null(子表相应的记录字段设置为null), no action , restrict. 其中 no action === restrict 后面两种是一样的, 就是父表在更新或删除记录的时候, 子表不管不采取任何动作)
    1.若不声明on update/delete,则默认是采用restrict方式.
    2.对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式. 即: 子表 在父表更新的时候跟着更新, 但是在父表删除记录的时候, 子表不管.

    ===========

    ==============================

  • 相关阅读:
    rsync命令使用方法
    Mysql(MyISAM和InnoDB)及Btree和索引优化
    初级java程序员-各公司技能要求
    Redis学习笔记二 (BitMap算法分析与BitCount语法)
    HTTP、TCP、IP协议常见面试题
    Redis学习笔记一(Redis的详细安装及Linux环境变量配置和启动)
    java-部分精选面试题
    Python基础-TypeError:takes 2 positional arguments but 3 were given
    Python3.7中urllib.urlopen 报错问题
    几道关于springboot、springCloud的面试题。
  • 原文地址:https://www.cnblogs.com/bkylee/p/12391038.html
Copyright © 2011-2022 走看看