我有一张表格,用于存储特定车辆使用的燃料数据。其中一列是current_mileage。有什么方法可以限制此表只接受此列的增加值?即如果第1行的current_mileage为1000,则第2行的current_mileage必须为1001或更高。
非常感谢, 百里
答案 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)
数据库本身并不知道它们存储的行的顺序;它不是数据库理论的一部分。在您的应用程序中,业务规则可以更好地满足这种逻辑。