Android SQLite - 强制增加整数列

时间:2011-04-02 16:04:07

标签: android sqlite

我有一张表格,用于存储特定车辆使用的燃料数据。其中一列是current_mileage。有什么方法可以限制此表只接受此列的增加值?即如果第1行的current_mileage为1000,则第2行的current_mileage必须为1001或更高。

非常感谢, 百里

4 个答案:

答案 0 :(得分:1)

您可以使用trigger来强制执行此约束。

这是一个假设您的表名为FuelConsumption,并且包含vehicle_id列的示例(只是猜测,您需要存储多个车辆的油耗? - 如果没有,只是省略WHEN部分中的WHERE子句:

CREATE TRIGGER trg_bi_FuelConsumption
BEFORE INSERT ON FuelConsumption
WHEN NEW.current_mileage <= (SELECT MAX(current_mileage) FROM FuelConsumption WHERE vehicle_id = NEW.vehicle_id)
BEGIN
    RAISE(ABORT, 'Fuel consumption cannot decrease');
END;

我还建议对(vehicle_id, current_mileage)的组合设置UNIQUE约束。这将确保创建索引(从而大大加快触发器的WHEN部分),并且甚至在触发器之前将捕获相同的值。

如果您不想添加UNIQUE约束,那么至少在这两列上添加一个(非唯一的)索引。

答案 1 :(得分:0)

为什么不将current_mileage作为主键?

答案 2 :(得分:0)

您不能在表创建中约束它。在插入新数据之前,您必须通过自己的programaticall来完成。所以你可以有类似的东西:

Cursor c = db.rawQuery("SELECT current_mileage FROM table_name ORDER BY current_mileage DESC LIMIT 1");
c.moveToFirst();
int max = c.getInt(c.getColumnIndex("current_mileage"));

然后,您必须确保下一个插入内容必须包含大于current_mileage的{​​{1}}。

答案 3 :(得分:-1)

数据库本身并不知道它们存储的行的顺序;它不是数据库理论的一部分。在您的应用程序中,业务规则可以更好地满足这种逻辑。