2

我正在尝试同时从两个不同的表中删除行。这些表看起来像这样:

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

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

我正在尝试删除等于 'SUCCESS' 的所有行,并从中删除VALUE链接到through的行。里面可以有多个相同的行。fieldSRCHVALUEvalue_idSRCHvalue_id

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

4

3 回答 3

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 时。

于 2012-06-14T14:09:52.460 回答
3

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

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

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

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

于 2012-06-14T14:25:51.080 回答
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;
于 2012-06-14T14:20:41.333 回答