多表操作

       实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系。

1.1    表与表之间的关系

l  一对多关系:

n  常见实例:客户和订单,分类和商品,部门和员工.

n  一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.

l  多对多关系:

n  常见实例:学生和课程、用户和角色

n  多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.

l  一对一关系:(了解)

n  在实际的开发中应用不多.因为一对一可以创建成一张表.

n  两种建表原则:

u  外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。

u  外键是主键:主表的主键和从表的主键,形成主外键关系。

1.2    外键约束

现在我们有两张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下,我们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键

此时“分类表category”称为:主表,“cid”我们称为主键。“商品表products”称为:从表,category_id称为外键。我们通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多关系。

外键特点:

u  从表外键的值是对主表主键的引用。

u  从表外键类型,必须与主表主键类型一致。

l  声明外键约束     

语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);

[外键名称]用于删除外键约束的,一般建议“_fk”结尾

altertable 从表 drop foreignkey 外键名称

l  使用外键目的:

n  保证数据完整性

1.3    一对多操作

1.3.1    分析

  • category分类表,为一方,也就是主表,必须提供主键cid

  • products商品表,为多方,也就是从表,必须提供外键category_id

  • 1.3.2    实现:分类和商品

    ###创建分类表

    create table category(

    cidvarchar(32) PRIMARY KEY ,

    cnamevarchar(100)        #分类名称

    );

    # 商品表

    CREATE TABLE `products` (

    `pid`varchar(32) PRIMARY KEY  ,

    `name`VARCHAR(40) ,

    `price`DOUBLE

    );

    #添加外键字段

    alter table products add column category_id varchar(32);

    #添加约束

    alter table products add constraint product_fkforeign key (category_id) references category (cid);

    1.3.3    操作

    #1 向分类表中添加数据

    INSERT INTO category (cid ,cname) VALUES('c001','服装');

    #2 向商品表添加普通数据,没有外键数据,默认为null

    INSERT INTO products (pid,pname) VALUES('p001','商品名称');

    #3 向商品表添加普通数据,含有外键信息(数据存放在)

    INSERT INTO products (pid ,pname ,category_id)VALUES('p002','商品名称2','c001');

    #4 向商品表添加普通数据,含有外键信息(数据不存在) -- 不能异常

    INSERT INTO products (pid ,pname ,category_id)VALUES('p003','商品名称2','c999');

    #5 删除指定分类(分类被商品使用) -- 执行异常

    DELETE FROM category WHERE cid = 'c001';

    1.4    多对多

    1.4.1    分析

    • 商品和订单多对多关系,将拆分成两个一对多。

    • products商品表,为其中一个一对多的主表,需要提供主键pid

    • orders 订单表,为另一个一对多的主表,需要提供主键oid

    • orderitem中间表,为另外添加的第三张表,需要提供两个外键oid和pid

    1.4.2    实现:订单和商品

    ### 商品表[已存在]

    ### 订单表

    create table `orders`(

    `oid`varchar(32) PRIMARY KEY ,

    `totalprice` double   #总计

    );

    ### 订单项表

    create table orderitem(

    oidvarchar(50),-- 订单id

    pidvarchar(50)-- 商品id

    );

    ###---- 订单表和订单项表的主外键关系

    alter table `orderitem` add constraintorderitem_orders_fk foreign key (oid) references orders(oid);

    ###---- 商品表和订单项表的主外键关系

    alter table `orderitem` add constraintorderitem_product_fk foreign key (pid) references products(pid);

    ### 联合主键(可省略)

    alter table `orderitem` add primary key (oid,pid);

    1.4.3    操作

    #1 向商品表中添加数据

    INSERT INTO products (pid,pname) VALUES('p003','商品名称');

    #2 向订单表中添加数据

    INSERT INTO orders (oid ,totalprice)VALUES('x001','998');

    INSERT INTO orders (oid ,totalprice)VALUES('x002','100');

    #3向中间表添加数据(数据存在)

    INSERT INTO orderitem(pid,oid)VALUES('p001','x001');

    INSERT INTO orderitem(pid,oid)VALUES('p001','x002');

    INSERT INTO orderitem(pid,oid)VALUES('p002','x002');

    #4删除中间表的数据

    DELETE FROM orderitem WHERE pid='p002' AND oid ='x002';

    #5向中间表添加数据(数据不存在) -- 执行异常

    INSERT INTO orderitem(pid,oid)VALUES('p002','x003');

    #6删除商品表的数据 -- 执行异常

    DELETE FROM products WHERE pid = 'p001';

数据库_mysql多表操作的更多相关文章

  1. 第69节:Java中数据库的多表操作

    第69节:Java中数据库的多表操作 前言 学习数据库的多表操作,去电商行业做项目吧!!! 达叔,理工男,简书作者&全栈工程师,感性理性兼备的写作者,个人独立开发者,我相信你也可以!阅读他的文 ...

  2. 数据库 MySQL 之 表操作、存储引擎

    数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名(     字段名1 ...

  3. MyBatis实现Mysql数据库分库分表操作和总结

    前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步.这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这 ...

  4. django连接mysql数据库以及建表操作

    django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找 ...

  5. django系列5.2--ORM数据库的单表操作

    单表操作 在views.py中添加对数据库的操作语句 #在逻辑代码中导入你要操作的表 from app import models def add_book(request): ''' 添加表记录 : ...

  6. 数据库_7_SQL基本操作——表操作

    SQL基本操作——表操作 建表的过程就是声明列的过程. 表与字段是密不可分的. 一.新增数据表 create table [if not exists] 表名( 字段名字 数据类型, 字段名字 数据类 ...

  7. 模型层之ORM、数据库和单表操作

    一.ORM简介 ORM是“对象-关系-映射”的简称,一般指持久化数据和实体对象的映射 1.1 什么是“持久化” 持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中( ...

  8. JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

    黑马程序员 我们知道,在设计一个Javabean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对多的关系,学生与老师直接又多对 ...

  9. django系列5.3--ORM数据库的多表操作

    首先来创建一个模型,数据库的关系就清楚了 models.py from django.db import models # Create your models here. class Author( ...

随机推荐

  1. msql修改密码

    修改的用户都以root为列.一.拥有原来的myql的root的密码: 方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password " ...

  2. U盘安装centos7.1出现dracut问题的超简单解决方法

    恰好今天有空,于是抽空回忆一下之前U盘安装CENTOS7时遇到的一个大坑.U盘装系统习惯了,就顺手用大白菜工具刻了一个CentOS 7.1的minimun ISO镜像到U盘,于是噩梦开始了.如果有人像 ...

  3. 最近学习的sql查询语句连接查询,标记一下

    select wordbase.name,wb.name,wordconnection.wordid,wordconnection.aid,wordbase.goodsid,goods.hscode, ...

  4. 并发编程之IO模型比较和Selectors模块

    主要内容: 一.IO模型比较分析 二.selectors模块 1️⃣ IO模型比较分析 1.前情回顾: 上一小节中,我们已经分别介绍过了IO模型的四个模块,那么我想大多数都会和我一样好奇, 阻塞IO和 ...

  5. 编码总结,以及对BOM的理解

    一.前言 在跨平台.跨操作系统或者跨区域之间,经常会涉及到编码的问题,因为前段时间在项目中,遇到了因为编码而产生乱码的问题,以前对编码也是一知半解,所以决定对编码有一个更为深入的了解,因此才有了这篇自 ...

  6. JS中深拷贝数组、对象、对象数组方法(转载)

    我们在JS程序中需要进行频繁的变量赋值运算,对于字符串.布尔值等可直接使用赋值运算符 “=” 即可,但是对于数组.对象.对象数组的拷贝,我们需要理解更多的内容. 首先,我们需要了解JS的浅拷贝与深拷贝 ...

  7. Opencv Harris角点检测

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  8. 文件操作getc

    getc函数的作用是从打开的文件中获取一个字符,并加文件指针自动加1,获取的字符在返回值中. 我写了一个读取一个文件255个字节的程序. int main() { FILE *p; fopen_s(& ...

  9. VS优化编译配置

    在使用VS2010编译C++程序的时候,每次修改工程中的某一个文件,点击“生成-仅用于项目-仅生成**”时,往往都是整个工程都需要重新编译一遍.由于这个工程代码量太大,每次编译完成都需要将近10分钟左 ...

  10. [Training Video - 6] [File Reading] Using log object in the Groovy class

    Car c= new Car(log); c.print() class Car{ def log public Car(log){ this.log=log } public void print( ...