0005_cascade_fks.up.sql

 1-- Add ON DELETE CASCADE to labels/task_id and blockers/task_id+blocker_id.
 2-- SQLite has no ALTER TABLE ADD CONSTRAINT, so we rebuild both tables.
 3
 4-- Drop dangling label rows before introducing stricter FK behavior.
 5DELETE FROM labels WHERE task_id NOT IN (SELECT id FROM tasks);
 6
 7CREATE TABLE labels_new (
 8    task_id TEXT,
 9    label   TEXT,
10    PRIMARY KEY (task_id, label),
11    FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
12);
13
14INSERT INTO labels_new (task_id, label)
15    SELECT task_id, label FROM labels;
16
17DROP TABLE labels;
18
19ALTER TABLE labels_new RENAME TO labels;
20
21CREATE TABLE blockers_new (
22    task_id    TEXT,
23    blocker_id TEXT,
24    PRIMARY KEY (task_id, blocker_id),
25    FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
26    FOREIGN KEY (blocker_id) REFERENCES tasks(id) ON DELETE CASCADE
27);
28
29INSERT INTO blockers_new (task_id, blocker_id)
30    SELECT task_id, blocker_id FROM blockers;
31
32DROP TABLE blockers;
33
34ALTER TABLE blockers_new RENAME TO blockers;