数据库多表操作

微信公众号:菜鸟永恒

第1章 多表操作

实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。


1.1 表与表之间的关系
有3类表关系:一对多(多对一)、多对多、一对一(了解)
? 一对多关系:
? 常见实例:学生和考试成绩(画图),客户和订单,分类和商品,部门和员工.
? 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.


? 多对多关系:
? 常见实例:学生和教师,商品和订单(画图),学生和课程、用户和角色
? 多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.

? 一对一关系:(了解)
? 在实际的开发中应用不多,比如QQ号码,和QQ用户信息
? 因为一对一可以创建成一张表.
? 两种建表原则:
? 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。
? 外键是主键:主表的主键和从表的主键,形成主外键关系。

1.2 外键约束

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

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

? 从表外键的值是对主表主键的引用。
? 从表外键类型,必须与主表主键类型一致。

? 声明外键约束
语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
[外键名称] 用于删除外键约束的,一般建议“_fk”结尾
alter table 从表 drop foreign key 外键名称
? 使用外键目的:
? 保证数据完整性

1.3 一对多操作
1.3.1 分析

? category分类表,为一方,也就是主表,必须提供主键cid
? products商品表,为多方,也就是从表,必须提供外键category_id

1.3.2 实现:分类和商品

创建分类表

create table category(
cid int(32) PRIMARY KEY ,
cname varchar(100) #分类名称
);

商品表

CREATE TABLE products (
pid int PRIMARY KEY ,
pname VARCHAR(40) ,
price DOUBLE ,
category_id int
);

添加约束

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

1.3.3 操作

1 向分类表中添加数据

INSERT INTO category (cid ,cname) VALUES(1,‘服装‘);

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

INSERT INTO products (pid,pname) VALUES(1,‘商品名称‘);

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

INSERT INTO products (pid ,pname ,category_id) VALUES(2,‘商品名称2‘, 1);

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

INSERT INTO products (pid ,pname ,category_id) VALUES(3,‘商品名称2‘,9);

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

DELETE FROM category WHERE cid = 1;

1.4 多对多
1.4.1 分析


? 商品和订单多对多关系,将拆分成两个一对多。
? products商品表,为其中一个一对多的主表,需要提供主键pid
? orders 订单表,为另一个一对多的主表,需要提供主键oid
? orderitem中间表,为另外添加的第三张表,需要提供两个外键oid和pid

1.4.2 实现:订单和商品

商品表[已存在]

订单表

create table orders(
oid int PRIMARY KEY ,
totalprice double #总计
);

订单项表

create table orderitem(
oid int,-- 订单id
pid int(50)-- 商品id
);

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

alter table orderitem add constraint orderitem_orders_fk foreign key (oid) references orders(oid);

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

alter table orderitem add constraint orderitem_product_fk foreign key (pid) references products(pid);

1.4.3 操作

1 向商品表中添加数据

INSERT INTO products (pid,pname) VALUES(3,‘商品名称‘);

2 向订单表中添加数据

INSERT INTO orders (oid ,totalprice) VALUES(1,998);
INSERT INTO orders (oid ,totalprice) VALUES(2,100);

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

INSERT INTO orderitem(pid,oid) VALUES(1, 1);
INSERT INTO orderitem(pid,oid) VALUES(1, 2);
INSERT INTO orderitem(pid,oid) VALUES(2,2);

4删除中间表的数据

DELETE FROM orderitem WHERE pid=2 AND oid = 2;

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

INSERT INTO orderitem(pid,oid) VALUES(2, 3);

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

DELETE FROM products WHERE pid = 1;

原文地址:https://www.cnblogs.com/starsyh/p/10293850.html

时间: 2024-10-08 20:15:18

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

数据库之表操作,数据操作

注意的几点:1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop database db1; 改:alter database db1 charset gbk; 查:show databases; #查看所有的数据库 show create database db1; #查看db1数据库 二.操作文件(表) 切换到文件夹下:use db1 增:create tabl

MYSQL数据库学习----MYSQL数据库、表操作和引擎区别

MYSQL数据库的操作 一:查看MYSQL中所有的数据库 SHOW DATABASES; 二:创建数据库 CRETAE DATABASE 数据库名称; 三:删除数据库 DROP DATABASE 数据库名称; 四:查看数据库支持的存储引擎 SHOW ENGINES; 四:连接MYSQL数据库 USE 数据库名称; MYSQL数据库中表的操作 一:查看数据库中的所有表格 SHOW TABLES: 二:查看表格的结构 DESC 表名称;(基本结构): 或 SHOW CREATE TABLE 表名称;

数据库和表操作

一.库操作 1.创建库 create database 库名[charset utf8]; 创建库[字符集为utf8] 默认为utf8 2.查看库 show databases; 查看所有库 show create database 库名; 查看某个库的创建信息 select database(); 查看当前操作的数据库名 3.删除库 drop database 库名; 删除某个库 4.修改库 alter database 库名 charset utf8; 修改库的字符集为utf8 二.mysq

Hibernate学习笔记(一)-->数据库单表操作

Hibernate框架是一个全ORM映射框架,是一个非常流行的数据库操作框架之一,现在比较流行的还有MyBatis半ORM映射框架 在MyEclipse IDE开发工具中,可以很轻松的搭建Hibernate框架. 一.搭建一个项目 1.首先在MyEclipse中搭建一个web项目. 2.选中项目右键-->myeclipse-->Project Facets-->找到hibernate.这样就为项目添加了hibernate支持 3.打开hibernate.cfg.xml配置文件,在可视化编

Django数据库数据表操作

建立表单 django通过设置类来快速建表,打开models.py 例: from __future__ import unicode_literals from django.db import models # Create your models here. # 新建一个类叫user,其实就是新建一张叫user的表 class user(models.Model): username = models.CharField(max_length = 20) password = models

数据库建表操作

数据库建<( ̄3 ̄)> 表语句 使用cmd  登录到mysq 数据库 show databases 首先创建一个数据库 create database person use person 选中数据库 create table student( id int primary key auto_increment, name varchar(30) not null, gender varchar(10) not null default '女', age int ); 创建表 desc pers

Django之数据库连表操作

1.表结构修改 如果原来表中已存在的数据,表结构修改后就会出现结构混乱,makemigrations更新表的时候就会出错,解决方法: 1.新增加的字段,设置允许为空.生成表的时候,之前数据新增加的字段就会为空.(null=True允许数据库中为空,blank=True允许admin后台中为空)2.新增加的字段,设置一个默认值.生成表的时候,之前的数据新增加字段就会应用这个默认值 图片.IP字段 ip = models.GenericIPAddressField(protocol="ipv4&qu

数据库:表操作-数据类型(数值类型)

介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 mysql常用数据类型概览 #1. 数字: 整型:tinyinit int bigint 小数: float :在位数比较短的情况下不精准 double :在位数比较长的情况下不精准 0.000001230123123123 存成:0.000001230000 decimal:(如果用小数,则用推荐使用decimal) 精准 内部原理是以字符串形式去存 #2. 字符串: char(10):

数据库连表操作之一对多

引言 表:part 有表如上所示,当成员达到一定数量时,我们需要开启大量的空间存放他们所在的部分,部门名称又长,而且存在大量重复,十分浪费存储空间. 我们将表一分为二 表1:part 表2:person 何为一对多呢? 在part表中的一条数据对应person表中多条数据 表1:part  表2:person 设置外键 创建关联 创建约束:在part表中的一条数据对应person表中多条数据 CREATE TABLE person ( nid int(11) NOT NULL AUTO_INCR