快捷搜索:

跟我学SQL:(七)从子表里删除数据

在这篇文章里我要描述一下若何从表格里删除列,要删除的这些列同时还要依附于其他表格的标准。要办理这个问题就必要一个很智慧而且完全遵守SQL92子查询声明的利用法度榜样。

我必须提醒读者的是,只管查询可能会遵守SQL的标准,然则浩繁的数据库临盆商会以不合的句法支持实现SQL。以下这个办理规划应该得当于大年夜多半数据库;然则,假如你的结果有进出,就照样应该查看一下文档。同时,因为这个查询要处置惩罚DELETE声明,以是你应该在将其利用于真实的临盆情况曩昔在实验数据长进行测试。

必要更多的背景信息?

查看这些文章就能快速上路:

《SQL根基I查数据查询》涉及到了DELETE查询的应用。

《应用SQL子选项来合并查询》阐明子选项查询能够削减对数据库哀求的数量,并供给了例子。

《SQL根基:查询多个表》供给了更多关于子选项的信息,还讲到了应用单个查询就能造访多个表格的多种其他措施。

宠物店的例子

要解释若何进行这种类型的列删除,我会应用如下这个数据库的表格,该数据库叫做PetStore,并包孕有清单(inventory)信息。在叫做“品种(breed)”的表A里,我存储有每种动物的信息和宠物店库存的信息。在叫做“清单”的表B里,包孕有市廛里特定动物的信息。

在这个例子里,我们先假设市廛把整窝Shitzu小狗都卖完了。我可以应用breed表格里的breed_id字段来删除Shitzu清单里的所有项目,就像这样:

DELETE FROM inventory WHERE breed_id IN

(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

首先,我要指定必要删除记录的表格,在这里是清单表格。然后再将识别字段breed_id同子选项子句的结果反复比对。我知道要找的是Shitzus,以是就能直接删掉落他们,而不用再在零丁的哀求里查询breed_id。

我必须要警告你的是,以这种要领应用DELETE声明是危险的,只有在你对数据库的布局很认识的环境下才能应用这些声明。DELETE查询会从受影响的表格里删除掉落整个列,你应该知道这对你所治理着的数据意味着什么。有个好法子是应用SELETE *这个短语替代DELETE关键字来对DELETE声明的子查询结果进行测试,这样就能包管结果里含有你要删除的所有器械,就像这样:

SELECT * FROM inventory WHERE breed_id IN

(SELECT breed_id FROM breed WHERE breed_name = ‘Shitzu’);

DELETE和JOIN联用

有人问到了办理这个问题另一个可能的法子:把JOIN子句和DELETE声明联合应用。因为曩昔没有应用过这种措施,我就钻研了一下,发明SQL Server的文档声明支持这个措施,只管它不相符SQL92。在颠末测试和扣问各类数据库平台的熟手在行之后,我发明把DELETE和JOIN声明联合应用在我测试过的任何平台上都行不通。

从多个表格里一次删除

以上的办理规划还没有解释若何应用父表从多个子表里删除信息。然则SQL92规范里没有供给完成这项义务的标准办理规划。

DELETE的声明不能把多个表格作为一个参数吸收。作为一个具有破坏性的查询,这能包管在敕令要被履行的地方不会呈现歧义。此外,这个限定防止了在单个声明内将AND和多个子查询联用。假如测试SELECT声明的结果用以反省DELETE查询将要影响到的是哪些数据,你会发明SELECT会返回多个表格的清单,DELETE不会影响到的多个子查询不在此中。

有很多可能的措施能够满意你的需求,例如在表格里创建一个字段,用以指明该项目是否为活动的。或者,你可以应用一些数据库里的预存法度榜样在每个所需的DELETE查询里迭代。

您可能还会对下面的文章感兴趣: