add batch remove batch split batch comment selection show hidden batches hide batch highlight batch
db<>fiddle
donate feedback about
By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
Help with an interesting Postgres question: Why isn't an Index Only Scan used on a partition accessed via the parent table?.
CREATE TABLE parent (
parent_id integer PRIMARY KEY
, txt text
);

CREATE TABLE child (
child_id integer PRIMARY KEY
, parent_id integer REFERENCES parent(parent_id) ON DELETE RESTRICT -- make sure even this works
, txt text
);

INSERT INTO parent VALUES
(1, 'foo')
, (2, 'bar')
;

INSERT INTO child VALUES
(1, 1, 'foo')
, (2, 2, 'bar')
, (3, 2, 'baz') -- parent_id 2 has two children
;
CREATE TABLE
CREATE TABLE
INSERT 0 2
INSERT 0 3
-- Delete child 1, cascades
WITH x AS (
DELETE FROM child
WHERE child_id = 1
RETURNING parent_id, child_id
)
DELETE FROM parent p
USING x
WHERE p.parent_id = x.parent_id
AND NOT EXISTS (
SELECT FROM child c
WHERE c.parent_id = x.parent_id
AND c.child_id <> x.child_id
);
DELETE 1
-- Delete child 2, doesn't cascade
WITH x AS (
DELETE FROM child
WHERE child_id = 2
RETURNING parent_id, child_id
)
DELETE FROM parent p
USING x
WHERE p.parent_id = x.parent_id
AND NOT EXISTS (
SELECT FROM child c
WHERE c.parent_id = x.parent_id
AND c.child_id <> x.child_id
);
DELETE 0
SELECT * FROM parent;
SELECT * FROM child;
parent_id txt
2 bar
SELECT 1
child_id parent_id txt
3 2 baz
SELECT 1