?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
MySQL可以在一個(gè)SQL語(yǔ)句中刪除多張表的記錄,也可以通過(guò)多個(gè)表之間的關(guān)聯(lián)關(guān)系刪除某個(gè)表的數(shù)據(jù),在MySQL4.0版本之后MySQL支持多表刪除。
假定目前有兩張表goods
和goods_price
表,前者是保存商品的具體信息,后者是保存商品的價(jià)格,具體的表結(jié)構(gòu)如下:
create table goods ( `id` int unsigned primary key auto_increment, `goods_name` varchar(30) not null default '' )engine innodb charset utf8; create table goods_price ( `goods_id` int unsigned not null, `price` decimal(8,2) not null default '0.00' )engine innodb charset utf8; insert into goods values (1,'商品1'),(2,'商品2'),(3,'商品3'),(4,'商品4'),(5,'商品5'); insert into goods_price values (1,'5.44'),(2,'3.22'),(3,'5.55'),(4,'0.00'),(5,'4.54');
這里我們不適用join連接操作進(jìn)行刪除,具體SQL如下:
delete g.*,p.* from goods as g,goods_price as p where g.id = p.goods_id and g.id = 1;
使用inner join
在連接時(shí)指定表與表之間的關(guān)聯(lián)關(guān)系進(jìn)行刪除,具體SQL如下:
DELETE g.*,p.* FROM goods as g INNER JOIN goods_price as p ON g.id=p.goods_id WHERE g.id = 2;
使用連接刪除的時(shí)候不必刪除所有表數(shù)據(jù),上面的SQL語(yǔ)句會(huì)同時(shí)刪除
goods
和goods_price
兩張表中的數(shù)據(jù),但是可以指定DELETE g.*
從而只刪除goods
表中的記錄,而不刪除goods_price
表中的記錄[DELETE g.* FROM goods as g INNER JOIN goods_price as p ON g.id=p.goods_id WHERE g.id = 3;
],但是在這里明顯是不合適的,但是我們可以這樣做。
left join的使用方法如上,具體的SQL如下:
DELETE g.*,p.* FROM goods as g LEFT JOIN goods_price as p ON g.id=p.goods_id WHERE g.price = '0.00';
給表新增約束外鍵并使用級(jí)聯(lián)(cascade)方式對(duì)表與表之間關(guān)系進(jìn)行約束。具體的SQL如下:
alter table goods_price add constraint FK_goods_id foreign key(goods_id) references goods(id) on delete cascade on update cascade;
修改完后我們后期刪除主表數(shù)據(jù),關(guān)聯(lián)表數(shù)據(jù)也會(huì)被刪除。
delete from goods where id=5;