如何删除未通过sqlite约束的行?

时间:2018-12-11 23:14:36

标签: sql sqlite

我有一个看起来像这样的表:

orders (

user_id INTEGER

item_id INTEGER

quantity INTEGER

... (more columns and constraints)

CHECK(quantity > 0)

)

我想将订单数量减少一,如果将数量减少为零,则将其删除。

是否可以在一项声明中做到这一点?

现在我有:

UPDATE orders SET quantity = quantity - 1 WHERE *blah blah complicated clause*

但是,当数量为1时,此操作将失败,并将数量保留在1,因为将其设置为0会导致约束错误。

我希望它只是在数量为1时删除该行,因为该订单现在为空。我该怎么办?

1 个答案:

答案 0 :(得分:2)

我建议根据complicated clause AND quantity < 2 之前删除行,以进行 UPDATE

例如(其中user_id = 1表示复杂的子句)

DROP TABLE IF EXISTS orders;
CREATE TABLE IF NOT EXISTS orders (user_id INTEGER, order_id INTEGER, quantity INTEGER, CHECK(quantity > 0) );
INSERT INTO orders VALUES (1,1,10),(1,2,1),(1,3,2),(2,1,3),(2,2,2),(2,3,5);
SELECT * FROM orders;
DELETE FROM orders WHERE user_id = 1 AND quantity < 2;
UPDATE orders SET quantity = quantity -1 WHERE user_id = 1;
SELECT * FROM orders;

结果(所有行完成之前的所有行):-

enter image description here

然后::-

enter image description here

即订单1和3已更新,而订单2(上面有圆圈)已删除。