欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【跟我学SQL:(七)从子表里删除数据】,下面是详细的分享!
跟我学SQL:(七)从子表里删除数据
我必须提醒读者的是,尽管查询可能会遵守SQL的标准,但是众多的数据库生产商会以不同的句法支持实现SQL。以下这个解决方案应该适合于大多数数据库;但是,如果你的结果有出入,就还是应该查看一下文档。同时,由于这个查询要处理DELETE声明,所以你应该在将其应用于真实的生产环境以前在实验数据上进行测试。
需要更多的背景信息?
查看这些文章就能快速上路:
《SQL基础I查数据查询》涉及到了DELETE查询的使用。
《使用SQL子选项来合并查询》说明子选项查询能够减少对数据库请求的数量,并提供了例子。
《SQL基础:查询多个表》提供了更多关于子选项的信息,还讲到了使用单个查询就能访问多个表格的多种其他方法。
宠物店的例子
要解释如何进行这种类型的列删除,我会使用如下这个数据库的表格,该数据库叫做PetStore,并包含有清单(inventory)信息。在叫做“品种(breed)”的表A里,我存储有每种动物的信息和宠物店库存的信息。在叫做“清单”的表B里,包含有商店里特定动物的信息。
在这个例子里,我们先假设商店把整窝Shitzu小狗都卖完了。我可以使用breed表格里的breed_id字段来删除Shitzu清单里的所有项目,就像这样:
| 以下为引用的内容:
DELETEFROMinventoryWHEREbreed_idIN (SELECTbreed_idFROMbreedWHEREbreed_name=‘Shitzu’); |
首先,我要指定需要删除记录的表格,在这里是清单表格。然后再将识别字段breed_id同子选项子句的结果反复比对。我知道要找的是Shitzus,所以就能直接删掉他们,而不用再在单独的请求里查询breed_id。
我必须要警告你的是,以这种方式使用DELETE声明是危险的,只有在你对数据库的结构很熟悉的情况下才能使用这些声明。DELETE查询会从受影响的表格里删除掉全部列,你应该知道这对你所管理着的数据意味着什么。有个好办法是使用SELETE*这个短语替代DELETE关键字来对DELETE声明的子查询结果进行测试,这样就能保证结果里含有你要删除的所有东西,就像这样:
SELECT*FROMinventoryWHEREbreed_idIN
(SELECTbreed_idFROMbreedWHEREbreed_name=‘Shitzu’);
DELETE和JOIN联用
有人问到了解决这个问题另一个可能的办法:把JOIN子句和DELETE声明联合使用。由于以前没有使用过这种方法,我就研究了一下,发现SQLServer的文档声明支持这个方法,尽管它不符合SQL92。在经过测试和询问各种数据库平台的老手之后,我发现把DELETE和JOIN声明联合使用在我测试过的任何平台上都行不通。
从多个表格里一次删除
以上的解决方案还没有解释如何使用父表从多个子表里删除信息。但是SQL92规范里没有提供完成这项任务的标准解决方案。
DELETE的声明不能把多个表格作为一个参数接受。作为一个具有破坏性的查询,这能保证在命令要被执行的地方不会出现歧义。此外,这个限制防止了在单个声明内将AND和多个子查询联用。如果测试SELECT声明的结果用以检查DELETE查询将要影响到的是哪些数据,你会发现SELECT会返回多个表格的清单,DELETE不会影响到的多个子查询不在其中。
有很多可能的方法能够满足你的需求,例如在表格里创建一个字段,用以指明该项目是否为活动的。或者,你可以使用一些数据库里的预存程序在每个所需的DELETE查询里迭代。
以上所分享的是关于跟我学SQL:(七)从子表里删除数据,下面是编辑为你推荐的有价值的用户互动:
相关问题:在c#里如何编写删除sql中多个表中的数据的代码
答:几个表存在关联吧?这样的数据牵涉到数据的完整性. 常用方法: 1:在主表上建立on deleted的触发器,在删除主表数据时自动删除子表相关行.这样只需要调用删除主表的sql语句就可以. 2:使用(带有事务处理的)存储过程,在存储过程中将关联的表依次做数据... >>详细
相关问题:怎样删除存在主外键关系的数据,怎样编写SQL语句
答:如果你的表里面 使用了级联关系 你删除主表时 子表也就删除了。 如果咩有的话 你只能写where语句比较了之前如果有级联关系(级联关系:主键执行的操作同时影响外键)的话,只需要运行delete 列名 from 表名 where 约束条件 >>详细
相关问题:SQL中如何用一条语句删除一个学生(学生编号为0401...
答:假如你的 外键关系, 是 DELETE CASCADE 方式 的, 那么, 删除 主表的数据的时候, 数据库 会自动 删除掉 子表里面的数据 不需要额外写任何代码. 1> -- 创建外键(使用 ON DELETE CASCADE 选项,删除主表的时候,同时删除子表) 2> ALTER TABLE test_... >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
