从两个表中删除行

时间:2012-06-14 14:00:58

标签: sql oracle

我正在尝试同时从两个不同的表中删除行。表格如下所示:

TABLE - Value
-----------
ID
Field
<some other stuff...>

TABLE - Srch
-----------
Value_ID
Srch_ID
<some other stuff...>

我正在尝试删除VALUEfield等于'SUCCESS'的所有行,并删除SRCH中与VALUE相关联的行通过value_id。在SRCH中,可以有多个行具有相同的value_id

这个SQL语句会是什么样的?

3 个答案:

答案 0 :(得分:5)

我建议在2个表和ON DELETE CASCADE之间使用外键。因此,您只需要删除Value中的行,并删除Srch中的所有相应行。

您可以将以下约束添加到数据库中:

ALTER TABLE Srch ADD CONSTRAINT
FK_Value_ID FOREIGN KEY(Value_ID)
REFERENCES Value (ID) 
ON DELETE CASCADE;

为了清楚起见(引自xQbert评论):当删除Value中的ID时,“级联将始终发生”。

答案 1 :(得分:3)

虽然更改数据库以自动执行此操作是理想的,但如果这始终是您想要的行为,并且您对数据库具有这样做的权限。

否则,特别是如果这是一次或偶然的事情,它可以在一组2个简单查询中完成,一起运行:

Delete from Srch where value_id in (Select ID from value where field='SUCCESS')
Delete from value where field='SUCCESS'

如果这是一个实时系统,您希望将它们作为单个事务的一部分运行,这样您就不会在两个语句之间更新值,并留下孤立或类似的东西。如果使用正确的隔离级别运行,这将是您执行此操作的最简单,最简单的方法。

答案 2 :(得分:0)

或更复杂的解决方案使用PL / SQL但没有外键:

DEFINE 
v_success_count number;
v_val_id number;
BEGIN

SELECT INTO v_success_count count(*) FROM


WHILE (select count(*) FROM value WHERE field = 'SUCCESS') > 0
LOOP
    SELECT value_id INTO val_id FROM value WHERE field = 'SUCCESS' AND rownum = 1;

    DELETE FROM srch WHERE value_id = v_val_id;

    DELETE FROM value WHERE field = 'SUCCESS' AND rownum = 1;
END LOOP
COMMIT;
END;