Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除未通过sqlite约束的行?_Sql_Sqlite - Fatal编程技术网

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

如何删除未通过sqlite约束的行?,sql,sqlite,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 comp

我有一张这样的桌子:

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
时删除该行,因为订单现在为空。如何做到这一点?

我建议删除行,根据
复杂子句
,在执行更新之前,使用
和数量<2

e、 g.(其中,
user\u id=1
表示复杂的子句)

如果存在订单,则删除表格;
如果不存在订单,则创建表(用户id整数、订单id整数、数量整数、检查(数量>0));
在订单中插入值(1,1,10)、(1,2,1)、(1,3,2)、(2,1,3)、(2,2,2)、(2,3,5);
从订单中选择*;
从用户id=1且数量小于2的订单中删除;
更新订单集数量=数量-1,其中用户id=1;
从订单中选择*;
结果(完成任何操作之前的所有行):-

然后:-


i、 e.订单1和订单3已更新,订单2(在上面圈出)已删除

您可以暂时禁用检查(通过
忽略检查\u约束
pragma),执行更新,删除列为0的行,然后重新启用检查好的,非常感谢。我最后写了这样的东西(除了我有“数量=1”而不是“数量<2”,因为支票保证它不能为零或更少)。我在这里写下了我最初的问题,因为我认为可能有某种方法可以在一个SQL查询中实现,但如果没有,那就这样吧。谢谢
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;