oracle中如何用delect删除两个关联的表的一条信息,要是用delete不行那应该用啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中如何用delect删除两个关联的表的一条信息,要是用delete不行那应该用啥?相关的知识,希望对你有一定的参考价值。

如果关联的两个表一条信息同时删除,可用下列方法。
设关联的外键是ID,先设定外键类型为级联删除。
alter table B add constraint fk_ID foreign key (ID) references A(ID) on delete cascade;
然后delete from A where ID=nnnn; 就可以自动删除对应B表内容了。
参考技术A 如果关联的两个表一条信息同时删除,可用下列方法。
设关联的外键是ID,先设定外键类型为级联删除。
alter table B add constraint fk_ID foreign key (ID) references A(ID) on delete cascade;
然后delete from A where ID=nnnn; 就可以自动删除对应B表内容了。
参考技术B delete from table a,table b where a.? = b.?

mysql之delect语法

一:DELETE语法

  以往用delect删除表数据是都是单表(一个表)删除。对于关联表,往往都是先删除第一个表的数据,然后再写另一个delect语句删除另一个表的数据(浪费时间,又影响性能,与数据库交互两次)。通过查阅官方文档的delect语法。有一些新的感悟。

1.1:单表语法(完整语法)  

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name  #()
       [PARTITION (partition_name [, partition_name] ...)] #(分区)
       [WHERE where_condition]  #(删除条件)
       [ORDER BY ...] #(删除顺序)
       [LIMIT row_count]  #(现在一次删除的数量)

 对于[]里面都是一些可选阐述,对于每个参数的意思我也是大概了解,在此我就不多做解释了,有兴趣的课参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/delete.html

 1.2:多表语法(本次重点)

  语法1:  

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    tbl_name[.*] [, tbl_name[.*]] ...
    FROM table_references
    [WHERE where_condition]

DELETE [LOW_PRIORITY] [QUICK] [IGNORE]
    FROM tbl_name[.*] [, tbl_name[.*]] ...
    USING table_references
    [WHERE where_condition]

1.3:多表删除

  您可以在DELETE语句中指定多个表,以 根据WHERE子句中的条件从一个或多个表中删除行 您不能使用ORDER BYLIMIT在多表中 DELETE该 table_references子句列出了连接中涉及的表。

  对于第一个多表语法,仅FROM删除子句之前列出的表中的匹配行对于第二个多表语法,仅删除FROM子句(在USING子句之前)中列出的表中的匹配行结果是您可以同时从多个表中删除行,并具有仅用于搜索的其他表:

  语法1

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

  语法2:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

   例如:删除一班班集(id =1)和一班所有的学生(学生的班级classes.id=1)

  DELETE classes ,students FROM students INNER JOIN classes WHERE classes.id = 1 AND students.`class_id` = 1;

注意:我上面用的是inner join 关联也可用outer join(是默认关联语法),但推荐用inner join因为inner join是取得两表的交集(outer join也可以取交集),省去了一些麻烦,也可规避一些误操作。具体细节可关联查询细节

备注:前面的示例使用INNER JOIN,但多表DELETE语句可以使用语句中允许的其他类型的连接 SELECT,例如 LEFT JOIN例如,要删除不存在t1匹配项的行 t2,请使用LEFT JOIN

 1.4:使用别名(alise)

  多表中的表别名 DELETE只应table_references在语句部分声明。在其他地方,允许别名引用但不允许别名声明。

  语法:

DELETE a1, a2 FROM t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;

DELETE FROM a1, a2 USING t1 AS a1 INNER JOIN t2 AS a2
WHERE a1.id=a2.id;


注意不要写成:(定义标的别名要在from后面)
DELETE t1 AS a1, t2 AS a2 FROM t1 INNER JOIN t2
WHERE a1.id=a2.id;

DELETE FROM t1 AS a1, t2 AS a2 USING t1 INNER JOIN t2
WHERE a1.id=a2.id;

 

 

  

以上是关于oracle中如何用delect删除两个关联的表的一条信息,要是用delete不行那应该用啥?的主要内容,如果未能解决你的问题,请参考以下文章

mysql之delect语法

在Oracle数据库中如何用sql查询某一个用户名下的某张表里面的数据,select * from 表名 用户名 where id=1

oracle数据库中如何用sql语句查出重复字段以及如何删除?

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

在PL/SQL中如何用SQL语句查询数据库中所有表的数据数量?

oracle truncate和delete的区别?