Java学习日志(三十): 多表关系,多表关系SQL代码实现

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

多表关系

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 主表名(主键)

作用:保证数据的准确性和完整性

  1. 主表中有的数据,从表可以有,可以没有
  2. 主表中没有的数据,从表中也不能有
  3. 删除主表中的数据,必须保证从表没有使用

示例:给从表商品表中的字段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);

架构图:
在这里插入图片描述

发布了39 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Sakuraaaaaaa/article/details/104592412