前面,我们在谈INSERT语句时,使用两种语句:INSERT…SELECT 和 INSERT…VALUES。
INSERT…SELECT可以使用子查询。因为在写SELECT时。 *** = ***,这就是子查询。
我们还以tdb_goods这张表为例,这张表目前一共有22条数据,但是这22条数据中有很多重复的信息,下面我们简单来查看一下。
select * from tdb_goods\G;
比如这21、22条记录,他们的商品类别都是笔记本配件,他们的品牌都是索尼。这些都是重复的信息,我们都知道汉字占的字节数肯定要比数字要多,如果这种记录越来越多,那么你的数据表就越来越庞大,那么查找的时候速度就会越来越慢,那最好的办法就是使用外键来实现,如果使用外键,那么至少要有两张数据表,所以我们需要再做一张数据表来存储我们的产品分类和品牌。
下面我们就来创建商品的分类表,操作命令及结果如下:
CREATE TABLE IF NOT EXISTS tdb_goods_cates( cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREENT, cate_name VARCHAR(40) NOT NULL );
OK,我们的数据表创建成功。
那么我们该如何插入数据呢,难道我们要一条一条去查找吗,当然不用,一定会有其他的方法,我们可以对查找的分类进行分组来实现,下面我们来看一看我们该怎么写?操作命令及结果如下:
SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
我们发现一共分了这么几类,那么下面我们就要把这几类写到我们刚创建的那张数据表中。理论上有两种方法,一种我们可以用INSERT语句逐条的去插入。这种比较麻烦,那么有没有更简单的方法吗,当然有,我们可以使用之前我们提到过的INSERT…SELECT语句来实现,意思就是将查询的结果写入到我们指定的数据表中。
下面我们就来尝试一下这种方法,操作命令及结果如下:
INSERT tdb_goods_cates(cate_name) SELECT goods_cate FROM tdb_goods GROUP BY goods_cate;
我们发现记录插入成功,但是这里面还有一个问题,记录现在我们已经插入成功了,但是我们根本就没有使用过外键来实现。
我们来查看一下,我们输入SELECT * FROM tdb_goods\G;结果如下:
我们发现在这张表中仍然存储的是笔记本配件这些商品类别,而应该存储的是商品类别名所对应的那个数字编号,所以我们现在就需要根据我们的分类表去更新我们的商品表,就是参照tdb_goods_cates去更新tdb_goods这张表。以前我们学的是单表更新,那么现在我们要参照一个表去更新另一个表,那么这里就涉及到多表更新。