【问题标题】:deleting from two tables in single script in sql从 sql 中的单个脚本中的两个表中删除
【发布时间】:2016-10-12 12:56:05
【问题描述】:

我有三张桌子xx_1 , xx_2, xx_3 这样:

xx_1

id   obj_version_num     location
1      x                  ubudu
2      x                  bali
3      x                  india

xx_2

id   name          grade
1    abc           band 1 
2    xyz           band 2 
3    gdgd          band 3

xx_3 有:

  Name   details    col1          p_id
     abc    A         HDHD        10
     xyz    B         HDHD        20
     gdgd   C         HDHD        30  
     smith  D         HDHD        40

如果 xx_3 中的名称是 smith,我想从 xx_1 和 xx_2 中删除数据 目前我正在做:

delete from xx_1 
where id in (select distinct id from xx_2 t ,xx_3 k
where t.name=k.name
    and k.name ='Smith')

and then 
delete from xx_2 
where name ='Smith'

无论如何我可以同时从这两个表中删除数据吗?无需创建两个单独的脚本?

【问题讨论】:

  • 您需要两个语句,这是无法解决的。但当然它们可以存储在单个脚本中。
  • 如果这是您将经常做的事情,也许可以定义您的外键并使用“ON DELETE CASCADE”来执行您的单个语句删除。
  • @JNevill - 是的,我会定期执行这个包
  • 这里提到的表实际上并不符合外键关系。表 XX_3 没有 ID 只有名字和名字在实际场景中不能作为主键

标签: sql oracle


【解决方案1】:

没有办法用一条语句从多个表中删除,但更好的问题是为什么需要同时从所有表中删除?在我看来,您似乎并不完全了解事务在 Oracle 中是如何工作的。

假设您登录并从表 1 中删除一行,但不提交。就所有其他会话而言,该行尚未被删除。如果您打开另一个连接并查询该行,它仍然会存在。

然后依次从表 2、3 和 4 中删除。您还没有提交事务,所以数据库上的所有其他会话仍然可以看到已删除的行。

然后你提交。

同时,其他会话将不再看到您从 4 个表中删除的行,即使您在 4 个单独的语句中进行了删除。

有问题的编辑后编辑:

您可以将 3 个子表上的外键定义为“ON DELETE CASCADE”。然后,当您从父表中删除时,3 个子表中的所有关联行也将被删除。

【讨论】:

    【解决方案2】:

    您不能在单个语句中从多个表中删除,无论是否主键。

    【讨论】:

    • 如果您定义了外键关系并使用ON DELETE CASCADE,则可以。或者,如果您讨厌与您共事的人,您可以定义一个触发器。
    • 在那种情况下你可以,但他的问题是针对一个声明的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多