zoukankan      html  css  js  c++  java
  • MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系

    1.主键约束和外键约束

    外键约束
    * 外键必须是另一表的主键的值(外键要引用主键!)
    * 外键可以重复
    * 外键可以为空
    * 一张表中可以有多个外键!


    概念模型在数据库中成为表
    数据库表中的多对一关系,只需要在多方使用一个独立的列来引用1方的主键即可
    /*员工表*/
    create talbe emp (
    empno int primary key,/*员工编号*/
    ...
    deptno int/*所属部门的编号*/
    );
    /*部门表*/
    create table dept (
    deptno int primary key,/*部门编号*/
    ...
    );
    emp表中的deptno列的值表示当前员工所从属的部门编号。也就是说emp.deptno必须在dept表中是真实存在!
    但是我们必须要去对它进行约束,不然可能会出现员工所属的部门编号是不存在的。这种约束就是外键约束。
    我们需要给emp.deptno添加外键约束,约束它的值必须在dept.deptno中存在。外键必须是另一个表的主键!

    语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键)
    创建表时指定外键约束
    create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)
    );

    修改表时添加外键约束
    ALERT TABLE emp
    ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

    修改表时删除外键约束
    ALTER TABLE emp
    DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/

     

    外键约束

    2. 数据库一对一关系
    在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
    create table husband(
    hid int PRIMARY KEY,
    ...
    );
    create table wife(
    wid int PRIMARY KEY,
    ...
    ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) REFERENCES husband(hid)
    );
    其中wife表的wid即是主键,又是相对husband表的外键!
    husband.hid是主键,不能重复!
    wife.wid是主键,不能重复,又是外键,必须来自husband.hid。
    所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。
    同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。

    *****从表的主键即是外键!

    3. 数据库多对多关系
    在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。
    create table student(
    sid int PRIMARY KEY,
    ...
    );
    create table teacher(
    tid int PRIMARY KEY,
    ...
    );

    create table stu_tea(
    sid int,
    tid int,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) REFERENCES student(sid),
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) REFERENCES teacher(tid)
    );
    这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系
    例如在stu_tea表中的记录:sid为1001,tid为2001,这说明编号为1001的学生有一个编号为2001的老师
    sid tid
    101 201 /*编号为101的学生有一个编号为201的老师*/
    101 202 /*编号为101的学生有一个编号为202的老师*/
    101 203 /*编号为101的学生有一个编号为203的老师*/
    102 201 /*编号为102的学生有一个编号为201的老师*/
    102 204 /*编号为102的学生有一个编号为204的老师*/

    4.表的命名和规范

    5.多表查询的类型

     

    例如:连接三个表,至少需要两个连接条件

    栗子1:

    查询零售价大于200的无线鼠标
    SELECT p.productName,pd.dirName,p.salePrice
    FROM product p,productdir pd
    WHERE p.dir_id=pd.id AND p.saleprice>200 AND pd.dirName='无线鼠标'

    使用AND操作符增加查询条件

  • 相关阅读:
    单例模式
    Curator Zookeeper分布式锁
    LruCache算法原理及实现
    lombok 简化java代码注解
    Oracle客户端工具出现“Cannot access NLS data files or invalid environment specified”错误的解决办法
    解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
    Redis 3.0 Cluster集群配置
    分布式锁的三种实现方式
    maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令
    How to Use Convolutional Neural Networks for Time Series Classification
  • 原文地址:https://www.cnblogs.com/GumpYan/p/6053653.html
Copyright © 2011-2022 走看看