У меня небольшие проблемы с SQLite в Android. Поскольку мое приложение поддерживает Android 1.6, я не могу использовать внешние ключи, поэтому написал триггеры для обеспечения соблюдения этих ограничений.
Мои две таблицы - Vehicle и fuel_use. У транспортного средства и fuel_use есть столбец registration_number. Мой триггер гарантирует, что я не могу обновить регистрационный номер в транспортном средстве при наличии записей в fuel_use со ссылкой на регистрационный номер в транспортном средстве:
//on update vehicle
db.execSQL("CREATE TRIGGER fk_update_vehicle_trigger_fuel_references_vehicles_reg_no " +
"BEFORE UPDATE ON " + VEHICLE_TABLE_NAME +
" FOR EACH ROW BEGIN " +
"SELECT RAISE(ROLLBACK, 'update on table " + VEHICLE_TABLE_NAME + " violates foreign key constraint fk_update_vehicle_trigger_fuel_references_vehicles_reg_no') " +
"WHERE (SELECT " + REGISTRATION_NO_COLUMN + " FROM " + FUEL_USE_TABLE_NAME +
" WHERE " + REGISTRATION_NO_COLUMN + " = OLD." + REGISTRATION_NO_COLUMN + ") IS NOT NULL; " +
"END;");
Это прекрасно работает, так как останавливает обновления, которые оставляют строки fuel_use, ссылающиеся на несуществующие строки транспортного средства. Однако я только что обнаружил проблему - когда я пытаюсь обновить другой столбец в транспортном средстве - initial_m Пробег - этот триггер отключает его и вызывает откат. Я понимаю, почему это происходит, но не знаю, как переписать триггер, поэтому только обновления в столбце registration_number вызывают откат. Я пробовал:
BEFORE UPDATE ON " + VEHICLE_TABLE_NAME + "." + REGISTRATION_NO_COLUMN
но это не сработало. На самом деле было выброшено исключение.
Любая помощь будет принята с благодарностью.