我有两个实体 A 和 B,它们通过中间表在 MxN 关系中相关,因此总共有三个表。我的关系表 R 对其他两个表具有不可为空的 FK 约束。
我想从表 A 和 B 和 R 中删除 A 服从某些约束的所有条目(例如,我可以提供 A 表中的 id)。
是否可以在不使用存储过程且不违反非空约束的情况下从三个表中删除条目?
我想要类似的东西:
delete from A a, B b, R r where a.id=r.fk_a and B.id=r.fk_B a
我有两个实体 A 和 B,它们通过中间表在 MxN 关系中相关,因此总共有三个表。我的关系表 R 对其他两个表具有不可为空的 FK 约束。
我想从表 A 和 B 和 R 中删除 A 服从某些约束的所有条目(例如,我可以提供 A 表中的 id)。
是否可以在不使用存储过程且不违反非空约束的情况下从三个表中删除条目?
我想要类似的东西:
delete from A a, B b, R r where a.id=r.fk_a and B.id=r.fk_B a
这取决于。如果 r 和 b 之间的 fk 是用 指定的ON DELETE CASCADE
,你可以这样做:
START TRANSACTION;
DELETE FROM b
WHERE id IN (
SELECT r.b_id
FROM r
INNER JOIN a
ON r.a_id = a.id
WHERE <some condition on a>
);
DELETE FROM a
WHERE <some condition on a>;
COMMIT WORK;
如果没有级联删除,那么您可以使用临时表执行此操作:
CREATE TEMPORARY TABLE to_be_deleted_from_b
LIKE b;
START TRANSACTION;
INSERT INTO to_be_deleted_from_b
SELECT *
FROM b
INNER JOIN r
ON b.id = r.b_id
INNER JOIN a
ON r.a_id = a.id
WHERE <some condition on a>;
DELETE FROM r
WHERE a_id IN (
SELECT a.id
FROM a
WHERE <some condition on a>
);
DELETE FROM a
WHERE <some condition on a>;
DELETE FROM b
WHERE b.id IN (
SELECT id
FROM to_be_deleted_from_b
);
COMMIT WORK;
DROP TABLE to_be_deleted_from_b
您可以通过三个删除并使用临时表来做到这一点。
例子
BEGIN TRAN
INSERT INTO #R
SELECT R.*
FROM R r
INNER JOIN A a ON a.ID = r.fk_a
WHERE a.Column = 'AConstraint'
DELETE FROM R
FROM R r
INNER JOIN A a ON a.ID = r.fk_a
WHERE a.Column = 'AConstraint'
DELETE FROM A
FROM A a
INNER JOIN #R r ON r.fk_a = a.ID
DELETE FROM B
FROM B b
INNER JOIN #R r ON r.fk_b = b.ID
WHERE r.ID IS NULL
DROP TABLE #R
COMMIT TRAN