JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
Java学习日志(三十)
多表关系
1对多/多对多关系
1对1关系
SQL实现多表关系
SQL实现1对多关系
建表原则:从表使用主表的主键作为外键
- 主表:分类表category
- 从表:商品表products
添加主表和从表,并添加数据
-- 主表:分类表category
CREATE TABLE category(
-- 分类主键
cid INT PRIMARY KEY AUTO_INCREMENT,
-- 分类名称
cname VARCHAR(20)
);
-- 分类表添加数据
INSERT INTO category(cname) VALUES('服装'),('家电'),('化妆品'),('零食');
-- 创建从表:商品表products
CREATE TABLE products(
-- 商品主键
pid INT PRIMARY KEY AUTO_INCREMENT,
-- 商品名称
pname VARCHAR(20),
-- 商品价格
price DOUBLE,
-- 商品分类
category_cid INT
);
-- 商品表添加数据
INSERT INTO products(pname,price,category_cid) VALUES('羽绒服',300,1),('秋裤',20,1);
INSERT INTO products(pname,price,category_cid) VALUES('空调',998,2),('手电筒',10,2);
INSERT INTO products(pname,price,category_cid) VALUES('香奈儿',800,3),('大宝',8,3);
添加外键约束:
格式:使用修改表结构,添加列
alter table 从表名 add [constraint 外键名] foreign key(从表中的外键字段) references 主表名(主键)
作用:保证数据的准确性和完整性
- 主表中有的数据,从表可以有,可以没有
- 主表中没有的数据,从表中也不能有
- 删除主表中的数据,必须保证从表没有使用
示例:给从表商品表中的字段category_cid添加外键约束,使用主表分类表的主键作为外键
ALTER TABLE products ADD CONSTRAINT products_fk FOREIGN KEY(category_cid) REFERENCES category(cid);
此时的架构设计器:
主表中没有的数据,从表中也不能有
-- Cannot add or update a child row
INSERT INTO products(pname,price,category_cid) VALUES('足球',200,5);
删除主表中的数据,必须保证从表没有使用
扫描二维码关注公众号,回复:
9544979 查看本文章
-- Cannot delete or update a parent row
DELETE FROM category WHERE cid=3;
先删除从表中使用了cid为3的数据,再删除主表中cid为3的数据
DELETE FROM products WHERE category_cid=3;
DELETE FROM category WHERE cid=3;
删除外键约束:使用修改表结构,删除列
alter table 从表名 drop foreign key 外键名称
示例:
ALTER TABLE products DROP FOREIGN KEY products_fk;
SQL实现多对多关系
建表原则:创建一张中间表,使用两个主表的主键作为外键
- 主表:商品表products 订单表orders
- 中间表:products_orders
示例:创建主表订单表orders,中间表:products_orders,并添加数据,直接在创建表时设置外键
-- 创建主表订单表orders 字段:订单主键,订单总金额
CREATE TABLE orders(
-- 订单主键
oid INT PRIMARY KEY AUTO_INCREMENT,
-- 订单总金额
totalPrice DOUBLE
);
-- 订单表添加数据
INSERT INTO orders(totalPrice) VALUES(2098),(38),(328);
-- 创建中间表:products_orders
CREATE TABLE products_orders(
-- 商品主键(外键)
products_pid INT,
-- 订单主键(外键)
orders_oid INT,
-- 添加products_pid字段的外键约束,使用products表的pid作为外键
FOREIGN KEY(products_pid) REFERENCES products(pid),
-- 添加orders_oid字段的外键约束,使用orders表中的oid作为外键
FOREIGN KEY(orders_oid) REFERENCES orders(oid)
);
-- 中间表添加两个主表都有的数据
INSERT INTO products_orders VALUES(1,1),(3,1),(5,1);
INSERT INTO products_orders VALUES(2,2),(4,2),(6,2);
INSERT INTO products_orders VALUES(1,3),(2,3),(6,3);
此时架构设计器:
中间表添加主表products不存在的数据
-- Cannot add or update a child row
INSERT INTO products_orders VALUES(8,1);
中间表添加主表orders不存在的数据
-- Cannot add or update a child row
INSERT INTO products_orders VALUES(1,10);
删除主表order表中oid为3的数,中间表在使用,不能删除
-- Cannot delete or update a parent row
DELETE FROM orders WHERE oid=3;
先删除中间表中使用了oid为3的数据,再删除主表order表中oid为3的数
DELETE FROM products_orders WHERE orders_oid=3;
DELETE FROM orders WHERE oid=3;
省份和城市的一对多关系
- 主表:省份表province
- 从表:城市表city
-- 创建主表:省份表province 字段:省份主键,省份名称,省份描述
CREATE TABLE province(
-- 省份主键
pid INT PRIMARY KEY AUTO_INCREMENT,
-- 省份名称
pname VARCHAR(20),
-- 省份描述
description VARCHAR(50)
);
-- 省份表添加数据
INSERT INTO province(pname,description) VALUES('河北','雾霾'),('内蒙古','草原'),('广东','经济特区');
-- 创建从表:城市表city 字段:城市主键,城市名称,城市描述,所属省份
CREATE TABLE city(
-- 城市主键
cid INT PRIMARY KEY AUTO_INCREMENT,
-- 城市名称
cname VARCHAR(20),
-- 城市描述
description VARCHAR(50),
-- 所属省份(外键)
province_pid INT,
-- 添加province_pid字段的外键约束
FOREIGN KEY(province_pid) REFERENCES province(pid)
);
-- 城市表添加主表省份表存在的数据
INSERT INTO city(cname,description,province_pid) VALUES('石家庄','雾霾之最',1);
INSERT INTO city(cname,description,province_pid) VALUES('承德','避暑山庄',1);
INSERT INTO city(cname,description,province_pid) VALUES('包头','草原钢城',2);
INSERT INTO city(cname,description,province_pid) VALUES('赤峰','红山文化',2);
INSERT INTO city(cname,description,province_pid) VALUES('深圳','经济特区',3);
INSERT INTO city(cname,description,province_pid) VALUES('东莞','服务行业',3);
-- 城市表添加主表省份不存在的数据
-- Cannot add or update a child row
INSERT INTO city(cname,description,province_pid) VALUES('澳门','博彩',4);
-- 删除省份表中名称是广东的数据
-- Cannot delete or update a parent row
DELETE FROM province WHERE pname='广东';
自关联的1对多关系(了解)
-- 创建地区表:area 字段:地区主键,地区名称,地区描述,所属省份
CREATE TABLE AREA(
-- 地区主键
aid INT PRIMARY KEY AUTO_INCREMENT,
-- 地区名称
aname VARCHAR(20),
-- 地区描述
description VARCHAR(50),
-- 所属省份(外键)
area_aid INT,
-- 添加province_pid字段的外键约束
FOREIGN KEY(area_aid) REFERENCES AREA(aid)
);
-- 添加数据,如果没有写外键字段,则默认为null
INSERT INTO AREA(aname,description) VALUES('河北','雾霾'),('内蒙古','草原'),('广东','经济特区');
INSERT INTO AREA(aname,description,area_aid) VALUES('石家庄','雾霾之最',1);
INSERT INTO AREA(aname,description,area_aid) VALUES('承德','避暑山庄',1);
INSERT INTO AREA(aname,description,area_aid) VALUES('包头','草原钢城',2);
INSERT INTO AREA(aname,description,area_aid) VALUES('赤峰','红山文化',2);
INSERT INTO AREA(aname,description,area_aid) VALUES('深圳','经济特区',3);
INSERT INTO AREA(aname,description,area_aid) VALUES('东莞','服务行业',3);
-- 弊端,添加不存在省份的数据(错误数据),能够添加
INSERT INTO AREA(aname,description,area_aid) VALUES('香港','旅游',4);
架构图: