SQL 创建多表及多表之间关系

需求

分类表和商品表之间是不是有关系? 如果有关系,在数据库中如何表示这种关系

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
--创建一个新的数据库 day25
create database day25;
use day25;
--创建分类表 cid,cname,cdesc
create table category(
    cid int primary key auto_increment,
    cname varchar(20),
    cdesc varchar(50)
);

insert into category values(null,'手机数码','黑马生产的小手机');
--创建商品表 pid,pname,price,pdesc,cno
create table product(
    pid int primary key auto_increment,
    pname varchar(20),
    price double,
    pdesc varchar(50),
    cno int
);
insert into product values(null,'锤子',2999,'可以开核桃的',11);

-- 外键约束 foreign key
-- 主要是用来约束从表中记录,必须是参考主表的记录
从表: product
主表: category

-- 添加外键约束,添加到从表中
update product set cno=1 where pid=1;
alter table product add foreign key(cno) references category(cid);
-- 添加外加约束之后,无法删除,要想删除得先删除商品表中对应的cno
delete from category where cid=1;

-- 五大约束:
    主键约束: primary key  非空并且唯一
    唯一约束: unique  唯一可以为空
    非空约束: not null 不能为空
    检查约束: check(条件) mysql直接忽略检查约束

    外键约束: foreign key 约束从表中的记录必须参考主表

技术分析

  • 多表之间的关系如何来维护

外键约束: foreign key

  • 插入数据: 数据必须先存在于主表,然后再插入从表中的数据
  • 删除数据(删主表时): 必须先删除从表中数据,再删除主表中的数据

  • 多表之间的建表原则

  • 一对多: 学生和班级, 商品分类和商品

    • 建表原则: 在多的一方添加一个键,然后让它作为外键指向一的一方
  • 多对多: 学生和选课

    • 建表原则:创建一张中间表,将多对多的关系,拆分成一对多的关系, 中间表至少要包含两个外键,这两个外键分别指向各自原来的表
  • 一对一: 公民和身份证号,公司和公司地址

    • 建表原则:

    • 将两张表的主键建立连接,

    • 将两张合并成一张表
    • 将一对一的关系,拆分成一对多的关系,在任意一方添加一个外键约束,并且还要一个唯一约束