天津虚拟主机-SQLite 实现if not exist 类似功能的操作

这篇文章主要介绍了天津虚拟主机服务器SQLite 完成if not exist 类似功用的操作,具有很好的参考价值,希望对我们有所帮助。一起跟随小编过来看看吧。

需要完成:

if not exists(select * from ErrorConfig where Type=’RetryWaitSeconds’)
begin
insert into ErrorConfig(Type,Value1)
values(‘RetryWaitSeconds’,’3′)
end

只能用:

insert into ErrorConfig(Type,Value1)
select ‘RetryWaitSeconds’,’3′
where not exists(select * from ErrorConfig where Type=’RetryWaitSeconds’)

由于 SQLite 中不支持SP

弥补:sqlite3中NOT IN 不好用的问题

在用sqlite3了解SQL的时分遇到了一个百思不得其解的问题,也没有在google上找到答案。尽管最后用“迂回”的方式可巧处理了这个问题,但暂时不清楚原理是什么,目前精力有限,所以暂时记载下来,有待持续研讨。

数据库是这样的:

CREATE TABLE book (
id integer primary key,
title text,
unique(title)
);
CREATE TABLE checkout_item (
member_id integer,
book_id integer,
movie_id integer,
unique(member_id, book_id, movie_id) on conflict replace,
unique(book_id),
unique(movie_id)
);
CREATE TABLE member (
id integer primary key,
name text,
unique(name)
);
CREATE TABLE movie (
id integer primary key,
title text,
unique(title)
);

该数据库包括了4个表:book, movie, member, checkout_item。其中,checkout_item用于保存member对book和movie的借阅记载,属于关系表。

问一:哪些member还没有借阅记载?

SQL句子(SQL1)如下:

1SELECT * FROM member WHERE id NOT IN(SELECT member_id FROM checkout_item);

得到了想要的成果。

问二:哪些book没有被借出?

这看起来与上一个是类似的,所以我理所当然地运转了如下的SQL句子(SQL2):

1SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item);

但是——运转成果没有找到任何记载! 我看不出SQL2与SQL1这两条句子有什么不同,莫非是book表的问题?所以把NOT去掉,运转了如下查询句子:

1SELECT * FROM book WHERE id IN(SELECT book_id FROM checkout_item);

正确返回了被借出的book,其数量小于book表里的总行数,也就是说确实是有book没有借出的。

接着google(此处省略没有营养的字),没找到处理方案。但是,为什么member能够,book就不能够呢?它们之前有什么不同?仔细观察,发现checkout_item里的book_id和movie_id都加了一个unique,而member_id则没有。也许是这个原因?不必id了,换title试试:

SELECT * FROM book WHERE
title NOT IN(
SELECT title FROM book WHERE id IN(
SELECT book_id FROM checkout_item));

确实很迂回,但至少work了。。。

问题原因:当NOT碰上NULL

事实是,我自己的处理方案只不过是可巧work,这个问题发生跟unique没有关系。邱俊涛的解释是,“SELECT book_id FROM checkout_item”的成果中含有null值,导致NOT也返回null。当一个member只借了movie而没有借book时,发生的checkout_item中book_id就是空的。

处理方案是,在挑选checkout_item里的book_id时,把值为null的book_id去掉:

1SELECT * FROM book WHERE id NOT IN(SELECT book_id FROM checkout_item WHERE book_id IS NOT NULL);

总结

我在处理这个问题的时分方向是不对的,应该像调试程序相同,去检查中间成果。比方,运转如下句子,成果会包括空行:

1SELECT book_id FROM checkout_item

而运转下列句子,成果不会包括空行:

1SELECT member_id FROM checkout_item

这才是SQL1与SQL2两条句子执行过程中的不同。依据这个不同去google,更容易找到答案。当然了,没有NULL概念也是我“百思不得其解”的原因。