带有外键的 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;
我有一个简单的方案:
基本上,我有一个 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;