创建需求:
如何让分类表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,'馋嘴零食','瓜子花生,八宝粥,辣条');
商品属性定义
--所有商品
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的情况,依旧会报错!)
创建所属关系: alter table product add foreign key(cno) references category(cid);
报错:
delete from product where cno=12;
select * from product;
再次运行alter table product add foreign key(cno) references category(cid);
从上面的操作可以看出:添加外键,需要使用foreign key关键字;另外,如果关系已经创建,不允许轻易删除所属表的数据!
比如,如果删除category数据表中cid为5的数据,那么会报错,不允许删除
delete from category where cid=5;
要想执行上面的命令,首先得去product表, 删除所有分类cno为5 商品!
多表之间的建表原则 :
1.一对多
建表原则: 在多的一方添加一个外键,指向一的一方的主键 。
例如:商品和分类 。
2.多对多
建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表。
例如:老师和学生, 学生和课程 。
3.一对一
建表原则:
-
将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表;
-
直接将两张表合并成一张表;
-
将两张表的主键建立起连接,让两张表里面主键相等。
例如:公民和身份证。