数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

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


发布日期:2020年09月08日
 
跟我学SQL:从子表里删除数据

在这篇文章里我要描述一下如何从表格里删除列要删除的这些列同时还要依赖于其他表格的标准要解决这个问题就需要一个很聪明而且完全遵守SQL子查询声明的应用程序

我必须提醒读者的是尽管查询可能会遵守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的文档声明支持这个方法尽管它不符合SQL在经过测试和询问各种数据库平台的老手之后我发现把DELETE和JOIN声明联合使用在我测试过的任何平台上都行不通

从多个表格里一次删除

以上的解决方案还没有解释如何使用父表从多个子表里删除信息但是SQL规范里没有提供完成这项任务的标准解决方案

DELETE的声明不能把多个表格作为一个参数接受作为一个具有破坏性的查询这能保证在命令要被执行的地方不会出现歧义此外这个限制防止了在单个声明内将AND和多个子查询联用如果测试SELECT声明的结果用以检查DELETE查询将要影响到的是哪些数据你会发现SELECT会返回多个表格的清单DELETE不会影响到的多个子查询不在其中

有很多可能的方法能够满足你的需求例如在表格里创建一个字段用以指明该项目是否为活动的或者你可以使用一些数据库里的预存程序在每个所需的DELETE查询里迭代

上一篇:总结--常用的监控SQL语句集合

下一篇:SQL在存储过程中使用递归