【问题标题】:Android SQLite on update trigger更新触发器上的 Android SQLite
【发布时间】:2011-05-26 03:33:07
【问题描述】:

我在使用 Android 中的 SQLite 时遇到了一些问题。由于我的应用程序支持 Android 1.6,因此我无法使用外键,因此编写了触发器来强制执行这些约束。

我的两个表是vehicle 和fuel_use。 vehicle 和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_mileage——这个触发器不允许它并强制回滚。我理解为什么会发生这种情况,但不知道如何重写触发器,因此只有registration_number 列上的更新才会强制回滚。我试过了:

BEFORE UPDATE ON " + VEHICLE_TABLE_NAME + "." + REGISTRATION_NO_COLUMN

但这不起作用。实际上抛出了一个异常。

如有任何帮助,我们将不胜感激。

【问题讨论】:

    标签: android sqlite triggers


    【解决方案1】:

    试试:

    db.execSQL("CREATE TRIGGER fk_update_vehicle_trigger_fuel_references_vehicles_reg_no " +
            "BEFORE UPDATE OF " + REGISTRATION_NO_COLUMN + " 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;");
    

    看看这是否有效。

    【讨论】:

    • 很高兴为您提供帮助。从未在 SQLite 中尝试过触发器,因此看到它们在 Android 上工作还算有趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多