er','server/Work station','Dell','5388',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Mac Pro MD878CH/A Professional Desktop','server/Work station','Apple','28888',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W Headset Display Device','Laptop accessory','Sony','6999',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Business Backpage','Laptopaccessory','Sony','99',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X3250 M4 server 2583i14','server/Work station','IBM','6888',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Xuanlong Laptop Radiator','Laptop accessory','Windgod','',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' HMZ-T3W Headset Display Device','Laptop accessory','Sony','6999',DEFAULT,DEFAULT);
INSERT goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Business Backpage','Laptop accessory','Sony','99',DEFAULT,DEFAULT);
---INSERT...SELECT
INSERT [INTO] tbl_name [(col_name)] SELECT
使用的时候就这样,创建一个新的表
CREATE TABLE IF NOT EXISTS cates(
cate_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
cate_name VARCHAR(40) NOT NULL
);
然后把原数据表中的东西有选择性的插入进来
INSERT INTO CATES(CATE_NAME) SELECT GOODS_CATE FROM GOODS GROUP BY GOODS_CATE;
如果需要根据目录表cates,来更新我们的参数表——多表更新
----多表更新
--多步
UPDATE table_ref SET col_name=... ...
其中,ref是表的参照关系
这里有连接关系,INNER JOIN LEFT JOIN 等
最简单的是INNER,内连接
mysql> UPDATE GOODS INNER JOIN CATES ON GOODS_CATE=CATE_NAME
-> SET GOODS_CATE=CATE_ID;
(请原谅我不想打小写的了。。)
解释一下:更新goods这张表,内连接cates这张表,在什么条件呢——goods_cate=cate_name,设定的值是什么呢,是cates这张表中的cate_id
mysql> SELECT * FROM GOODS\G; 验证一下
--一步
CREATE...SELECT...
即创建表的同时写入连接的数据
这里的例子是:对品牌做连接更新
mysql> SELECT BRAND_NAME FROM GOODS GROUP BY BRAND_NAME;
mysql> CREATE TABLE IF NOT EXISTS brands(
-> brand_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> brand_name VARCHAR(40) NOT NULL
-> )
-> SELECT BRAND_NAME FROM GOODS GROUP BY BRAND_NAME;
就可以省去INSERT的操作了
但是这时候更新要出错
mysql> UPDATE GOODS INNER JOIN BRANDS ON BRAND_NAME=BRAND_NAME
-> SET BRAND_NAME=BRAND_ID;
ERROR 1052 (23000): Champ: 'BRAND_NAME' dans field list est ambigu
因为名字一样,要改字段,或者起别名AS
mysql> UPDATE GOODS AS G INNER JOIN BRANDS AS B ON G.BRAND_NAME=B.BRAND_NAME
-> SET G.BRAND_NAME=BRAND_ID;
虽然实现了外表的更新,但是,比如说goods_cate的类型还是varchar,而我们其实希望主表中,它是int类型的。这时候由于需要修改字段名以及数据类型,用ALTER CHANGE
mysql> ALTER TABLE GOODS
-> CHANGE GOODS_CATE CATE_ID SMALLINT UNSIGNED NOT NULL,
-> CHANGE BRAND_NAME BRAND_ID SMALLINT UNSIGNED NOT NULL;
这种外键称为事实外键,比foreign key的物理外键还要多
----连接
由于我们实现了多表的存储,但是由于显示等需求,要求多个表联动,需要用到连接
数据表参照ref:tbl_name [[AS] alias] | table_subquery [AS] alias
---INNER JOIN
使用ON来设定连接条件,WHERE一般做进一步的筛选
内连接,仅显示符合连接条件的记录
SELECT GOODS_ID,GOODS_NAME,CATE_NAME FROM GOODS INNER JOIN CATES ON GOODS.CATE_ID=CATES.CATE_ID;
翻译一下:选取goods表中的goods_id,goods_name,cate_name字段,但是显示的时候,需要内连接cates表(因为我们不想显示的是类型的数字表示),条件是当两者的cate_id字段相等;这里由于cate_i