Удаление строк из SQLite
Запрос DELETE FROM убирает строки из таблицы.
Условие WHERE ограничивает удаление; без
него таблица опустеет полностью. Подготовленный
DELETE безопасно принимает значение фильтра:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("trim.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
char* err = nullptr;
if (sqlite3_exec(
db,
"CREATE TABLE IF NOT EXISTS queue ("
"id INTEGER PRIMARY KEY,"
"task TEXT NOT NULL,"
"active INTEGER NOT NULL"
")",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO queue (task, active) "
"VALUES ('old', 0)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
if (sqlite3_exec(
db,
"INSERT INTO queue (task, active) VALUES ('new', 1)",
nullptr,
nullptr,
&err
) != SQLITE_OK) {
std::cerr << err << "\n";
sqlite3_free(err);
sqlite3_close(db);
return 1;
}
sqlite3_stmt* del = nullptr;
if (sqlite3_prepare_v2(
db,
"DELETE FROM queue WHERE active = ?",
-1,
&del,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_bind_int(del, 1, 0);
if (sqlite3_step(del) != SQLITE_DONE) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_finalize(del);
sqlite3_close(db);
return 1;
}
std::cout << sqlite3_changes(db) << "\n";
sqlite3_finalize(del);
sqlite3_close(db);
return 0;
}
После удаления выборка показывает оставшиеся строки.
Агрегат COUNT(*) помогает проверить эффект:
#include <iostream>
#include <sqlite3.h>
int main() {
sqlite3* db = nullptr;
if (sqlite3_open("trim.db", &db) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
sqlite3_stmt* count = nullptr;
if (sqlite3_prepare_v2(
db,
"SELECT COUNT(*) FROM queue",
-1,
&count,
nullptr
) != SQLITE_OK) {
std::cerr << sqlite3_errmsg(db) << "\n";
sqlite3_close(db);
return 1;
}
if (sqlite3_step(count) == SQLITE_ROW) {
std::cout << sqlite3_column_int(count, 0) << "\n";
}
sqlite3_finalize(count);
sqlite3_close(db);
return 0;
}
Создайте таблицу tickets_log в box.db
с полями code и sold, добавьте
две записи и удалите строки, где sold
равен 0.
Выведите, сколько записей осталось в таблице
tickets_log, обойдя все строки выборкой.