外鍵的作用:
約束作用
eg:商品表有類(lèi)別id,關(guān)聯(lián)類(lèi)別表的id必須要插入類(lèi)別表里邊有的id才行
拆分表格
? ? ? ? ? ? ? ? ? ? ? ?把圖一拆分成圖二-圖1-圖2,參考圖三





一、goods_cates
-- unsigned:無(wú)符號(hào)(非負(fù)數(shù))
-- 創(chuàng)建商品分類(lèi)表
create table if not exists goods_cates(?
? ? id int unsigned primary key auto_increment,
? ? name varchar(40) not null-- 類(lèi)別名稱(chēng) 40字長(zhǎng)度 不允許為空
);
-- 查詢(xún)goods表中商品的種類(lèi)
select cate_name from goods group by cate_name;?
-- 將分組結(jié)果寫(xiě)入到goods_cates數(shù)據(jù)表
insert into goods_cates (name) select cate_name from goods group by cate_name;-- select前不能加values??
-- 通過(guò)goods_cates數(shù)據(jù)表來(lái)更新goods表
update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;
-- 解釋?zhuān)焊耮oods表起別名g —— inner join goods_cates關(guān)聯(lián)類(lèi)別表 —— 給類(lèi)別表起名c —— on后面相當(dāng)條件 —— g.cate_name=c.name 關(guān)聯(lián)條件商品表的類(lèi)別名稱(chēng)=類(lèi)別表名稱(chēng) —— set g.cate_name=c.id設(shè)置商品表的類(lèi)別名稱(chēng)=……
-- 通過(guò)alter table語(yǔ)句修改表結(jié)構(gòu)(既改名字又改類(lèi)型)change:重命名
alter table goods change cate_name cate_id int unsigned not null;-- 類(lèi)別的名稱(chēng)cate_name重命名為cate_id
-- 關(guān)聯(lián)外鍵
alter table goods add foreign key (cate_id) references goods_cates(id);
-- 給alter table goods添加一個(gè)foreign key(外鍵)給cate_id設(shè) —— references:關(guān)聯(lián) 和goods_cates類(lèi)別表的id關(guān)聯(lián)
-- 在 goods 數(shù)據(jù)表中插入商品(用來(lái)測(cè)試外鍵的)
insert into goods (name,cate_id,brand_id,price)
values('LaserJet Pro P1606dn 黑白激光打印機(jī)', 12, 4,'1849');
-- 取消外鍵
alter table goods drop foreign key goods_ibfk_1;
二、goods_brands
-- unsigned:無(wú)符號(hào)(非負(fù)數(shù))
-- 創(chuàng)建商品分類(lèi)表
create table if not exists goods_brands(?
? ? id int unsigned primary key auto_increment,
? ? name varchar(40) not null-- 類(lèi)別名稱(chēng) 40字長(zhǎng)度 不允許為空
);
-- 查詢(xún)goods表中商品的種類(lèi)
select brand_name from goods group by brand_name;
-- 將分組結(jié)果寫(xiě)入到goods_cates數(shù)據(jù)表
insert into goods_brands (name) select brand_name from goods group by brand_name;-- select前不能加values??
-- 通過(guò)goods_cates數(shù)據(jù)表來(lái)更新goods表
-- 更新goods表起別名g —— inner join goods_cates關(guān)聯(lián)類(lèi)別表 —— 給類(lèi)別表起名c —— on后面相當(dāng)條件 —— g.cate_name=c.name 關(guān)聯(lián)條件商品表的類(lèi)別名稱(chēng)=類(lèi)別表名稱(chēng) —— set g.cate_name=c.id設(shè)置商品表的類(lèi)別名稱(chēng)=……
update goods as g inner join goods_brands as b on g.brand_name=b.name set g.brand_name=b.id;
-- 分別在goods_cates和goods_brands類(lèi)別表中插入記錄
insert into goods_brands(name) values ('路由器'),('交換機(jī)'),('網(wǎng)卡');
-- 通過(guò)alter table語(yǔ)句修改表結(jié)構(gòu)(既改名字又改類(lèi)型)change:重命名
alter table goods change brand_name brand_id int unsigned not null;-- 類(lèi)別的名稱(chēng)brand_name重命名為brand_id
-- 關(guān)聯(lián)外鍵
-- 給alter table goods添加一個(gè)foreign key(外鍵)給cate_id設(shè) —— references:關(guān)聯(lián) 和goods_cates類(lèi)別表的id關(guān)聯(lián)
alter table goods add foreign key (brand_id) references goods_brands(id);
-- 在 goods 數(shù)據(jù)表中插入商品(用來(lái)測(cè)試外鍵的)
insert into goods (name,cate_id,brand_id,price)
values('LaserJet Pro P1606dn 黑白激光打印機(jī)', 12, 4,'1849');
-- 取消外鍵
alter table goods drop foreign key goods_ibfk_2;