2010-03-11 94 views
3

这是怎么回事?我期望下面的删除从表中删除所有内容。对于我来说,sqlite3的行为有没有根本的误解?sqlite3删除不会删除所有内容?

sqlite> .schema 

CREATE TABLE ip_domain_table (ip_domain TEXT, answer TEXT, ttl INTEGER, PRIMARY KEY(ip_domain, answer, ttl)); 

sqlite> select count(*) from ip_domain_table where ttl < 9999999999 ; 

1605343 

sqlite> pragma cache_size=100000; delete from ip_domain_table where ttl < 9999999999; 

sqlite> select count(*) from ip_domain_table where ttl < 9999999999 ; 

258 

Q:为什么计数显示 “258”?它不应该是0吗?

如果我这样做,它会删除所有条目按预期方式。

sqlite> select count(*) from ip_domain_table; 

1605343 

sqlite> pragma cache_size=100000; delete from ip_domain_table; 

sqlite> select count(*) from ip_domain_table; 

0 

回答

3

重要的是要记住,SQLite的有一种叫做type affinity,这意味着每个列的数据类型仅仅是建议,并没有得到执行是非常重要的。所有列类型都可以存储任何类型的数据。这意味着您的整数列可以存储大于9999999999的数字,甚至可以存储字符串。

我会做到以下几点:

  1. 检查所有的TTL值都小于9999999999
  2. 是什么结果“SELECT * FROM ip_domain_table限制1”后,你的第一个删除?如果结果的ttl列是一个字符串或一个大于9999999999的数字,那么您有答案。

简单地使用delete from ip_domain_table;没有什么不对,就像你上面做的那样。

祝你好运!

0

首先,请注意您的表的ttl列是而不是的主键。它可能包含大于您指定的9999999999的值。

然后,如果你想删除表中的所有条目,试试这个来代替:

DELETE FROM ip_domain_table;