前面,我們在談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這張表。以前我們學的是單表更新,那么現在我們要參照一個表去更新另一個表,那么這里就涉及到多表更新。