带有外键的 Sqlite DELETE 触发器

Sqlite DELETE trigger with foreign key

我有一个简单的方案:

基本上,我有一个 incomerecord 和 incometype,因为它是 n-n 关系,所以我还有一个额外的 table 来跟踪 incomerecord 有哪些类型和多少类型的收入。

我想做的是当删除一条 IncomeRecordWithTypeValue 记录时,我想检查是否有任何实体留下了 IncomeRecord FOREIGN KEY,如果没有,我想删除 IncomeRecord。

我目前的做法是这样的:

database.execSQL(
"CREATE TRIGGER IF NOT EXISTS Trigger_IncomeTypeIncomeRecordDelete " +
"AFTER DELETE ON IncomeRecordWithTypeValue " +
"BEGIN DELETE FROM IncomeRecord " +
"WHERE ( SELECT * FROM IncomeRecordWithTypeValue WHERE IncomeRecordWithTypeValue.incomeRecordId = IncomeRecord.id " +
"HAVING COUNT(*) = 0)" +
"END");

但是,我收到以下语法错误:

BETWEEN, IN, LIMIT, ORDER or semicolon expected, got 'END'

我做错了什么?我的方法还不错吧?我的另一种方法是使用 inner join 但我基本上收到相同的错误

您可以使用 NOT EXISTS 检查 IncomeRecordWithTypeValue 中是否没有其他行与已删除行的 incomeRecordId 剩余:

CREATE TRIGGER IF NOT EXISTS Trigger_IncomeTypeIncomeRecordDelete 
AFTER DELETE ON IncomeRecordWithTypeValue  
BEGIN 
  DELETE FROM IncomeRecord   
  WHERE id = OLD.incomeRecordId 
    AND NOT EXISTS(SELECT 1 FROM IncomeRecordWithTypeValue tv WHERE tv.incomeRecordId = IncomeRecord.id); 
END;