Cascade Triggers in SQLite

The trigger looks like it is deleting districts whose id equals id_countries, that is, the where clause is actually

WHERE districts.id_countries = districts.id

You need to reference the id from the countries table. In a delete trigger, use "old" to do this.

CREATE TRIGGER [delete_country]
BEFORE DELETE
ON [countries]
FOR EACH ROW
BEGIN
DELETE FROM districts WHERE districts.id_countries = old.id;
END

Also, I would suggest changing your schema naming convention. Usually, the table name is singular, and corresponds to the entity in a row. I would have a country table with columns id and name, a district table with id, country_id and name, etc.

country
-------
id
name

district
-------
id
country_id
name

municipality
------------
id
district_id
name

parish
-----
id
municipality_id
name

Then the trigger would be

CREATE TRIGGER [delete_country]
BEFORE DELETE
ON [country]
FOR EACH ROW
BEGIN
DELETE FROM district WHERE district.country_id = old.id;
END

PRAGMA foreign_keys = 1;

This will enable the enforcement of foreign keys just like in MySQL. If you define your table with 'ON DELETE CASCADE' clause like so:

CREATE TABLE "notification" (
    "rowid" INTEGER NOT NULL,
    "user"  INTEGER NOT NULL,
    "task"  TEXT NOT NULL,
    "payload"   TEXT NOT NULL,
    PRIMARY KEY("rowid"),
    FOREIGN KEY("user") REFERENCES "user" ON UPDATE CASCADE ON DELETE CASCADE
);

The whole row will be deleted when (in this case) it's parent user row is deleted.

P.S: I know this is a dead thread, but I figured I put this here for the people viewing in 2019. ;D