第1章 多表操做学习
实际开发中,一个项目一般须要不少张表才能完成。例如:一个商城项目就须要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在必定的关系,接下来咱们将在单表的基础上,一块儿学习多表方面的知识。spa
1.1 表与表之间的关系
有3类表关系:一对多(多对一)、多对多、一对一(了解)
一对多关系:
常见实例:学生和考试成绩(画图),客户和订单,分类和商品,部门和员工.
一对多建表原则:在从表(多方)建立一个字段,字段做为外键指向主表(一方)的主键.code
多对多关系:
常见实例:学生和教师,商品和订单(画图),学生和课程、用户和角色
多对多关系建表原则:须要建立第三张表,中间表中至少两个字段,这两个字段分别做为外键指向各自一方的主键.ci
一对一关系:(了解)
在实际的开发中应用很少,好比QQ号码,和QQ用户信息
由于一对一能够建立成一张表.
两种建表原则:
外键惟一:主表的主键和从表的外键(惟一),造成主外键关系,外键惟一unique。
外键是主键:主表的主键和从表的主键,造成主外键关系。开发
1.2 外键约束it
如今咱们有两张表“分类表”和“商品表”,为了代表商品属于哪一个分类,一般状况下,咱们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键table
此时“分类表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 操做
INSERT INTO category (cid ,cname) VALUES(1,'服装');
INSERT INTO products (pid,pname) VALUES(1,'商品名称');
INSERT INTO products (pid ,pname ,category_id) VALUES(2,'商品名称2', 1);
INSERT INTO products (pid ,pname ,category_id) VALUES(3,'商品名称2',9);
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 操做
INSERT INTO products (pid,pname) VALUES(3,'商品名称');
INSERT INTO orders (oid ,totalprice) VALUES(1,998);
INSERT INTO orders (oid ,totalprice) VALUES(2,100);
INSERT INTO orderitem(pid,oid) VALUES(1, 1);
INSERT INTO orderitem(pid,oid) VALUES(1, 2);
INSERT INTO orderitem(pid,oid) VALUES(2,2);
DELETE FROM orderitem WHERE pid=2 AND oid = 2;
INSERT INTO orderitem(pid,oid) VALUES(2, 3);
DELETE FROM products WHERE pid = 1;