2010-03-11 6 views
3

Что здесь происходит? Я ожидал бы следующего удаления, чтобы удалить все из таблицы. Есть ли фундаментальное неправильное понимание того, как работает sqlite3 с моей стороны?sqlite3 delete не удаляет все?

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. Убедитесь, что все ваши ценности ТТЛ меньше 9999999999.
  2. Что является результатом «выберите * из ip_domain_table предела 1», после того, как ваш первый удалить? Если столбец ttl вашего результата является строкой или числом больше 9999999999, у вас есть свой ответ.

Нет ничего плохого в использовании delete from ip_domain_table;, как вы делаете это выше.

Удачи вам!

0

Прежде всего, имейте в виду, что столбец ttl вашей таблицы: NOT первичный ключ. Он может содержать значения, превышающие указанные вами 9999999999.

Затем, если вы хотите удалить все записи из таблицы, попробуйте вместо этого:

DELETE FROM ip_domain_table; 
Смежные вопросы