本文主要介绍SQLite的操作实现类似if not exist的功能,有很好的参考价值,希望对大家有所帮助。来和边肖一起看看吧。
需要实现:
如果不存在(select * from ErrorConfig,其中Type=’RetryWaitSeconds ‘)
开始
插入到ErrorConfig(类型,值1)
值(‘ RetryWaitSeconds ‘,’ 3 ‘)
目标
仅使用:
插入到ErrorConfig(类型,值1)
选择“RetryWaitSeconds”,“3”
不存在时(select * from error config where Type=’ RetryWaitSeconds ‘)
因为SQLite不支持SP
补充:sqlite3中没有的不好用的问题
用sqlite3熟悉SQL的时候,遇到了一个莫名其妙的问题,在google上也没有找到答案。虽然最终通过“迂回”的方式解决了问题,但暂时不清楚是什么原理。目前精力有限,暂时记录,有待进一步研究。
数据库如下所示:
创建表格簿(
id整数主键,
标题文本,
独特(标题)
);
创建表checkout_item(
member_id整数,
book_id整数,
电影id整数,
冲突时唯一(成员标识,图书标识,电影标识)替换,
唯一(book_id),
唯一(电影id)
);
创建表成员(
id整数主键,
名称文本,
唯一(名称)
);
创建表格电影(
id整数主键,
标题文本,
独特(标题)
);
数据库包含四个表:book、movie、member、checkout _ item。其中checkout_item用于保存图书和电影按成员的借阅记录,属于关系表。
问:哪位成员还没有借唱片?
SQL语句(SQL1)如下所示:
1SELECT * FROM不在的成员(SELECT member _ id FROM check out _ item);
得到了想要的结果。
问:哪些书没有被借出?
这看起来与上一个相似,所以我自然地运行了下面的SQL语句(SQL2):
1 SELECT * FROM book WHERE id NOT IN(SELECT book _ id FROM check out _ item);
但是在——的运行结果中没有找到记录!我看不出SQL2和SQL1有什么区别。是书桌吗?因此,删除NOT并运行以下查询语句:
1 SELECT * FROM book WHERE id IN(SELECT book _ id FROM check out _ item);
借出的书归还正确,数量小于图书表中图书总数,说明还有未借出的图书。
然后谷歌(此处省略无营养这个词),也没有找到解决方案。但是,为什么一个会员可以,一本书不行?他们之前有什么区别?仔细观察发现,checkout_item中的book_id和movie_id有唯一的加法,而member_id没有。也许这就是原因?不需要id,换个标题试试:
SELECT * FROM book WHERE
标题不在(
从id所在的图书中选择标题(
SELECT book _ id FROM check out _ item));
这真的很迂回,但至少它的工作。
原因:当NOT命中NULL时
事实是,我自己的解决方案刚好管用,这个问题和unique无关。邱的解释是“从checkout_item中选择book_id”的结果包含null值,导致NOT返回null。当会员只借电影不借书时,生成的checkout_item中的book_id为空。
解决方案是在checkout_item中选择book_id时删除空的book_id:
1 SELECT * FROM book WHERE id NOT IN(SELECT book _ id FROM check out _ item WHERE book _ id NOT NULL);
摘要
我在解决这个问题时走错了方向。我应该像调试程序一样检查中间结果。例如,如果运行以下语句,结果将包含空行:
1从checkout_item中选择book_id
运行以下语句时,结果将不包含空行:
1从checkout_item选择member_id
这就是SQL1和SQL2语句执行的区别。根据这种差异,去谷歌更容易找到答案。当然,NULL这个概念的缺失也是我“不解”的原因。
来源:剧本之家
地址:https://www.jb51.net/article/203321.htm


