MySQL数据表--创建多表、以及多表关系(添加外键)

创建需求:

如何让分类表category和商品表product之间产生关系? 如果有关系,在数据库中如何表示这种关系?

我们首先建立数据表、插入数据

create table category(
  cid int primary key auto_increment,
  cname varchar(10),
  cdesc varchar(31)
);

insert into category values(null,'手机数码','电子产品,黑马生产'),(null,'鞋靴箱包','江南皮鞋厂倾情打造'),(null,'香烟酒水','黄鹤楼,茅台,二锅头'),(null,'酸奶饼干','娃哈哈,蒙牛酸酸乳'),(null,'馋嘴零食','瓜子花生,八宝粥,辣条');

MySQL数据表--创建多表、以及多表关系(添加外键)

商品属性定义

--所有商品
1.商品ID
2.商品名称
3.商品的价格
4.生产日期
5.商品分类ID

商品表和商品分类表 : 所属关系

create table product(
    pid int primary key auto_increment,
      pname varchar(10),
      price double,
      pdate timestamp,
      cno int
);

insert into product values(null,'小米mix4',998,null,1),(null,'锤子',2888,null,1),(null,'阿迪王',99,null,2),(null,'老村长',88,null,3),(null,'劲酒',35,null,3),(null,'小熊饼干',1,null,4),(null,'卫龙辣条',1,null,5),(null,'旺旺大饼',1,null,5);

insert into product values(null,'充气的',1,null,12);   (创建所属关系,将会报错“ Cannot add or update a child row:”;如果需要创建,需要使用命令“delete from product where cno=12;”删除该条数据;如果已经创建关系,因为不存在cno=12的情况,依旧会报错!)

MySQL数据表--创建多表、以及多表关系(添加外键)

创建所属关系: alter table product add foreign key(cno) references category(cid);

报错:MySQL数据表--创建多表、以及多表关系(添加外键)

delete from product where cno=12;

select * from product;

MySQL数据表--创建多表、以及多表关系(添加外键)

再次运行alter table product add foreign key(cno) references category(cid);

MySQL数据表--创建多表、以及多表关系(添加外键)

从上面的操作可以看出:添加外键,需要使用foreign key关键字;另外,如果关系已经创建,不允许轻易删除所属表的数据!

比如,如果删除category数据表中cid为5的数据,那么会报错,不允许删除

 delete from category where cid=5;

MySQL数据表--创建多表、以及多表关系(添加外键)

要想执行上面的命令,首先得去product表, 删除所有分类cno为5 商品!

多表之间的建表原则 :

1.一对多

建表原则: 在多的一方添加一个外键,指向一的一方的主键 。

例如:商品和分类 。

2.多对多

建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表。 

例如:老师和学生, 学生和课程 。

3.一对一

建表原则:

  • 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表;

  • 直接将两张表合并成一张表;

  • 将两张表的主键建立起连接,让两张表里面主键相等。

例如:公民和身份证。