一:问题:目前只有一个goods表,我们想要增加一个商品分类信息,比如:移动设备这个分类信息,只通过goods表无法完成商品分类的添加,那么如何实现添加商品分类信息的操作?
答案:创建一个商品分类表,把goods表中的商品分类信息添加到该表中。
将goods表中的分类名称更改成商品分类表中对应的分类id
mysql> select * from goods;
+----+---------------------------------------+---------------------+------------+-----------+---------+------------+
| id | name | cate_name | brand_name | price | is_show | is_saleoff |
+----+---------------------------------------+---------------------+------------+-----------+---------+------------+
| 1 | r510vc 15.6英寸笔记本 | 笔记本 | 华硕 | 3399.000 | | |
| 2 | y400n 14.0英寸笔记本电脑 | 笔记本 | 联想 | 4999.000 | | |
| 3 | g150th 15.6英寸游戏本 | 游戏本 | 雷神 | 8499.000 | | |
| 4 | x550cc 15.6英寸笔记本 | 笔记本 | 华硕 | 2799.000 | | |
| 5 | x240 超极本 | 超级本 | 联想 | 4880.000 | | |
| 6 | u330p 13.3英寸超极本 | 超级本 | 联想 | 4299.000 | | |
| 7 | svp13226scb 触控超极本 | 超级本 | 索尼 | 7999.000 | | |
| 8 | ipad mini 7.9英寸平板电脑 | 平板电脑 | 苹果 | 1998.000 | | |
| 9 | ipad air 9.7英寸平板电脑 | 平板电脑 | 苹果 | 3388.000 | | |
| 10 | ipad mini 配备 retina 显示屏 | 平板电脑 | 苹果 | 2788.000 | | |
| 11 | ideacentre c340 20英寸一体电脑 | 台式机 | 联想 | 3499.000 | | |
| 12 | vostro 3800-r1206 台式电脑 | 台式机 | 戴尔 | 2899.000 | | |
| 13 | imac me086ch/a 21.5英寸一体电脑 | 台式机 | 苹果 | 9188.000 | | |
| 14 | at7-7414lp 台式电脑 linux ) | 台式机 | 宏碁 | 3699.000 | | |
| 15 | z220sff f4f06pa工作站 | 服务器/工作站 | 惠普 | 4288.000 | | |
| 16 | poweredge ii服务器 | 服务器/工作站 | 戴尔 | 5388.000 | | |
| 17 | mac pro专业级台式电脑 | 服务器/工作站 | 苹果 | 28888.000 | | |
| 18 | hmz-t3w 头戴显示设备 | 笔记本配件 | 索尼 | 6999.000 | | |
| 19 | 商务双肩背包 | 笔记本配件 | 索尼 | 99.000 | | |
| 20 | x3250 m4机架式服务器 | 服务器/工作站 | ibm | 6888.000 | | |
| 21 | 商务双肩背包 | 笔记本配件 | 索尼 | 99.000 | | |
+----+---------------------------------------+---------------------+------------+-----------+---------+------------+
21 rows in set (0.00 sec)
二:拆表的过程:
1:创建新表:
mysql> create table goods_cates(id int primary key auto_increment not null,name varchar(50) not null);
Query OK, 0 rows affected (0.06 sec)
2:把goods表中的商品分类添加到商品分类表:
mysql> insert into goods_cates(name) select cate_name from goods group by cate_name;
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> select * from goods_cates;
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | 台式机 |
| 2 | 平板电脑 |
| 3 | 服务器/工作站 |
| 4 | 游戏本 |
| 5 | 笔记本 |
| 6 | 笔记本配件 |
| 7 | 超级本 |
+----+---------------------+
7 rows in set (0.00 sec)
3:更新goods表中的商品分类信息:将goods表中的分类名称更改成商品分类表中对应的分类id。(连接更新)
mysql> update goods inner join goods_cates on goods.cate_name = goods_cates.name set goods.cate_name = goods_cates.id;
Query OK, 21 rows affected (0.00 sec)
Rows matched: 21 Changed: 21 Warnings: 0
mysql> select * from goods;
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
| id | name | cate_name | brand_name | price | is_show | is_saleoff |
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
| 1 | r510vc 15.6英寸笔记本 | 5 | 华硕 | 3399.000 | | |
| 2 | y400n 14.0英寸笔记本电脑 | 5 | 联想 | 4999.000 | | |
| 3 | g150th 15.6英寸游戏本 | 4 | 雷神 | 8499.000 | | |
| 4 | x550cc 15.6英寸笔记本 | 5 | 华硕 | 2799.000 | | |
| 5 | x240 超极本 | 7 | 联想 | 4880.000 | | |
| 6 | u330p 13.3英寸超极本 | 7 | 联想 | 4299.000 | | |
| 7 | svp13226scb 触控超极本 | 7 | 索尼 | 7999.000 | | |
| 8 | ipad mini 7.9英寸平板电脑 | 2 | 苹果 | 1998.000 | | |
| 9 | ipad air 9.7英寸平板电脑 | 2 | 苹果 | 3388.000 | | |
| 10 | ipad mini 配备 retina 显示屏 | 2 | 苹果 | 2788.000 | | |
| 11 | ideacentre c340 20英寸一体电脑 | 1 | 联想 | 3499.000 | | |
| 12 | vostro 3800-r1206 台式电脑 | 1 | 戴尔 | 2899.000 | | |
| 13 | imac me086ch/a 21.5英寸一体电脑 | 1 | 苹果 | 9188.000 | | |
| 14 | at7-7414lp 台式电脑 linux ) | 1 | 宏碁 | 3699.000 | | |
| 15 | z220sff f4f06pa工作站 | 3 | 惠普 | 4288.000 | | |
| 16 | poweredge ii服务器 | 3 | 戴尔 | 5388.000 | | |
| 17 | mac pro专业级台式电脑 | 3 | 苹果 | 28888.000 | | |
| 18 | hmz-t3w 头戴显示设备 | 6 | 索尼 | 6999.000 | | |
| 19 | 商务双肩背包 | 6 | 索尼 | 99.000 | | |
| 20 | x3250 m4机架式服务器 | 3 | ibm | 6888.000 | | |
| 21 | 商务双肩背包 | 6 | 索尼 | 99.000 | | |
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
21 rows in set (0.00 sec)
4:能不能创建表的同时插入数据呢?
假如我们想要添加一个品牌,比如:双飞燕这个品牌信息,只通过goods表无法完成品牌信息的添加,那么如何实现添加品牌信息的操作?
答案:创建一个品牌表,把goods表中的品牌信息添加到该表中。
将goods表中的品牌名称更改成品牌表中对应的品牌id。
mysql> create table good_brands (
-> id int unsigned primary key auto_increment,
-> name varchar(40) not null) select brand_name as name from goods group by brand_name;
Query OK, 9 rows affected (0.08 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> select * from good_brands;
+----+--------+
| id | name |
+----+--------+
| 1 | ibm |
| 2 | 华硕 |
| 3 | 宏碁 |
| 4 | 惠普 |
| 5 | 戴尔 |
| 6 | 索尼 |
| 7 | 联想 |
| 8 | 苹果 |
| 9 | 雷神 |
+----+--------+
9 rows in set (0.00 sec)
注意:创建的时候查询语句的别名必须要取,而且要和创建的某一个字段相同。比如这个name。
同样更新goods表中的品牌信息。
mysql> update goods as g inner join good_brands gb on g.brand_name = gb.name set g.brand_name = gb.id;
Query OK, 21 rows affected (0.00 sec)
Rows matched: 21 Changed: 21 Warnings: 0
mysql> select * from goods;
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
| id | name | cate_name | brand_name | price | is_show | is_saleoff |
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
| 1 | r510vc 15.6英寸笔记本 | 5 | 2 | 3399.000 | | |
| 2 | y400n 14.0英寸笔记本电脑 | 5 | 7 | 4999.000 | | |
| 3 | g150th 15.6英寸游戏本 | 4 | 9 | 8499.000 | | |
| 4 | x550cc 15.6英寸笔记本 | 5 | 2 | 2799.000 | | |
| 5 | x240 超极本 | 7 | 7 | 4880.000 | | |
| 6 | u330p 13.3英寸超极本 | 7 | 7 | 4299.000 | | |
| 7 | svp13226scb 触控超极本 | 7 | 6 | 7999.000 | | |
| 8 | ipad mini 7.9英寸平板电脑 | 2 | 8 | 1998.000 | | |
| 9 | ipad air 9.7英寸平板电脑 | 2 | 8 | 3388.000 | | |
| 10 | ipad mini 配备 retina 显示屏 | 2 | 8 | 2788.000 | | |
| 11 | ideacentre c340 20英寸一体电脑 | 1 | 7 | 3499.000 | | |
| 12 | vostro 3800-r1206 台式电脑 | 1 | 5 | 2899.000 | | |
| 13 | imac me086ch/a 21.5英寸一体电脑 | 1 | 8 | 9188.000 | | |
| 14 | at7-7414lp 台式电脑 linux ) | 1 | 3 | 3699.000 | | |
| 15 | z220sff f4f06pa工作站 | 3 | 4 | 4288.000 | | |
| 16 | poweredge ii服务器 | 3 | 5 | 5388.000 | | |
| 17 | mac pro专业级台式电脑 | 3 | 8 | 28888.000 | | |
| 18 | hmz-t3w 头戴显示设备 | 6 | 6 | 6999.000 | | |
| 19 | 商务双肩背包 | 6 | 6 | 99.000 | | |
| 20 | x3250 m4机架式服务器 | 3 | 1 | 6888.000 | | |
| 21 | 商务双肩背包 | 6 | 6 | 99.000 | | |
+----+---------------------------------------+-----------+------------+-----------+---------+------------+
21 rows in set (0.00 sec)
5:最后要修改一下表结构。这是因为,goods里面的以前shivarchar()类型,而新表是int类型,最好将他们类型匹配起来,这里的cate_name与brand_name原来是字符串,现在要修改成cate_id和brand_id 此时的类型也要改。
mysql> show create table goods;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| goods | CREATE TABLE `goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(150) NOT NULL,
`cate_id` int(11) NOT NULL,
`brand_id` int(11) NOT NULL,
`price` decimal(10,3) NOT NULL DEFAULT '0.000',
`is_show` bit(1) NOT NULL DEFAULT b'1',
`is_saleoff` bit(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)