sql语句从主表删除一条数据,并且把先关联的多个子表数据也删除

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句从主表删除一条数据,并且把先关联的多个子表数据也删除相关的知识,希望对你有一定的参考价值。

有5个表,一个主表t1,4个子表别是,t2,t3,
t4,t5,主表和所有子表相关联的字段是id,现在要求是从主表t1根据一个id删除一条数据,然后其他子表也要删除与这个id相关联的数据

仅凭sql不可能实现,多条实现先删从表再删主表
楼主的需求解决方案
1.如果是编程实现,java框架hibernate的cascade可以模拟做到删主去重
2.表中设置好级联删除 这样设定好表后 可以实现删主去重 oracle为例
alter table AAA add constraint asd foreign key (BBB) references CCC(DDD) on delete cascade;
3.新增delete的行级触发器

4.存储过程 包含多条delete语句,使用时调用该过程
参考技术A

DELETE FROM table WHERE date in('c','e','f')

    结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;

    用外键关联删除,把B表的uid设成外键关联A表的ID,并关联删除操作。

    用存储过程,用事务来处理实现。

    创建数据库:CREATE DATABASE database-name删除数据库

    drop database dbname

    创建新表create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    删除新表:drop table tabname

    增加一个列:Alter table tabname add column col type

    添加主键:Alter table tabname add primary key(col)

    删除主键:Alter table tabname drop primary key(col)

    创建索引:create [unique] index idxname on tabname(col….)

    删除索引:drop index idxname

    创建视图:create view viewname as select statement

    删除视图:drop view viewname

参考技术B 如果建立了主外键约束,那么这个约束是可以关联删除的(建立的时候要加一个参数,这是oracle的写法,如果你不是oracle我不清楚其他数据库能不能这样做)。
建立触发器,这个所有数据库都可以。你这里就是after delete触发,也是删除语句,这个是可以的。
参考技术C 建议你写个存储过程,我写的一个,让你参考一下!CardNo是自定义的数据类型!用触发器容易出错
CREATE PROCEDURE DelFixUser
@CardNo CardNo
AS
Declare @CarNo CarNo
select @CarNo=车辆号码 from FixCardIndexTable
where 卡号=@CardNo
Delete from AllCardIndexTable
where 卡号=@CardNo
Delete from FixCardIndexTable
where 卡号=@CardNo
Delete from FixCardEndDateTable
where 卡号=@CardNo
Delete from CardPassWordTable
where 卡号=@CardNo
Delete from UserCarInfoTable
where 车辆牌号=@CarNo
说明:删除一个固定用户记录,同时从AllCardIndexTable、FixCardIndexTable、FixCardEndDateTable、CardPassWordTable和UserCarInfoTable表中删除相应的记录。本回答被提问者采纳

SQL初学者问题:从主表中填充一些子表的原理是啥?

【中文标题】SQL初学者问题:从主表中填充一些子表的原理是啥?【英文标题】:SQL beginner question : what is the principle to fill some sub-table from a main table?SQL初学者问题:从主表中填充一些子表的原理是什么? 【发布时间】:2021-06-25 13:12:12 【问题描述】:

我是数据库知识的初学者。 我开始在 Dallas db2 lite 主机上使用 cloud db2 lite 服务。 我已经将主表从 .csv 文件加载到我的 db2 lite 实例中。 该主表由数据(几乎 40 列和 40000 行)填充、填充。 从这个主表中,我想填写 3 个空的子表,我已经在其中定义了字段(比如说,列,类型,...)。 在我看来,我认为可以将子表“连接”到主表,以填充子表。 但是,我不明白这是否可能,或者怎么可能。

我试过INSERT "INTO ... SELECT ... FROM ... GROUP BY ... ORDER BY" SQL 命令类型。 这种类型的 SQL 命令填充子表。但按照我的做法,它只将数据从主表复制到子表。它不会将子表链接到已经填充的主表。

我感觉我还没有理解将数据从大型主表“泵”到子表中的原理,或者用来自主表的数据填充子表,将子表连接到主表。

有这样的原则吗?

【问题讨论】:

您能否解释一下“将子表链接到已经填充的主表”下的意思 在我初学者心目中的意思是:主表已满。子表为空。目标是填充子表,将它们不断地链接到主表。执行 INSERT INTO SELECT FROM GROUP BY 不会建立链接。 【参考方案1】:

如果您想将子表“链接”到主表,那么您可能根本不需要表。你想要一个视图:

create view subtable as
    select . . .
    from . . .;

您可以像查询任何其他表一样查询视图。但是SQL引擎每次都运行定义代码,所以数据始终是最新的。

【讨论】:

好的。我明白。而且,如果我想获取子表并从主表中填充它们,并保持它们与主表的链接?这是符合sql和数据库实践的原则吗? @anch 。 . .你有两个选择。更简单的是物化视图,它很像视图,只是数据实际上存储在数据库中,并且数据库保持最新(可能按计划)。二是使用触发器来保持两个表之间的一致性。 好的,明白了。对于关系子表,SQL 是否允许对视图和“之间”视图进行查询?原理是一样的吗? @anch 。 . .对于SELECT 查询,视图的使用与表一样。

以上是关于sql语句从主表删除一条数据,并且把先关联的多个子表数据也删除的主要内容,如果未能解决你的问题,请参考以下文章

根据子表的条件修改主表的数据

Oracle中,多表关联删除该怎么写?

SQL 如何把两个表相关联的数据一同删除

sql 两张表的联系是主表一个字段是由子表id加号拼接而成,请问怎么连

一条sql 俩个表级联查询的语句,我想只显示前七条,从表有一个字段是和主表对应的。要求一起显示。。。。

MySql 查询出对应子表的某个字段,并且关联起来