5-5:使用INSERT…SELECT插入记录
一. 前言
我们在将INSERT语句的时候讲过,INSERT除了VALUES外还有INSERT SET用法,而INSERT SET和INSERST VALUES的一大区别就是INSERT SET可以使用子查询,而INSERT SELECT可以将查询的结果写入数据表
另外在数据准备的过程中,很多字段都存在着重复的信息,比如很多品牌都是索尼,分类都是笔记本配件等,数据表一旦插入大量的记录时,查找数据的速度就会变慢,所以我们可以用以前学过的外键来解决这个问题
二.INSERT SET和INSERT SELECT
首先创建两个数据表作为外键,先创建商品分类表:
mysql> CREATE TABLE IF NOT EXISTS tdb_goods_cates(
-> cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> cate_name VARCHAR(40)
-> );
Query OK, 0 rows affected (0.06 sec)
如何插入商品分类表呢?本例只有几个商品分类表,可以一条条的导入,但是如果有几万个甚至更多的分类,一条条的手动导入显然是不可能的,但是可以利用前面学到的知识,查找的时候按照分类进行分组并使用INSERT SELECT语句便能解决这个问题,首先查看一下所有的分类:
mysql> SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
+---------------+
| goods_cate |
+---------------+
| 台式机 |
| 平板电脑 |
| 服务器/工作站 |
| 游戏本 |
| 笔记本 |
| 笔记本配件 |
| 超级本 |
+---------------+
7 rows in set (0.03 sec)
可以看到一共有7类,接下来使用INSERT SELECT将查询结果插入到商品分类表中:
mysql> INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
Query OK, 7 rows affected (0.01 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM tdb_goods_cates;
+---------+---------------+
| cate_id | cate_name |
+---------+---------------+
| 1 | 台式机 |
| 2 | 平板电脑 |
| 3 | 服务器/工作站 |
| 4 | 游戏本 |
| 5 | 笔记本 |
| 6 | 笔记本配件 |
| 7 | 超级本 |
+---------+---------------+
7 rows in set (0.00 sec)
mysql>
可以看到写入成功,参照分类表更新商品表的操作是多表更新,和以往的单表更新不同,我们将在下一节中讲解