gpt4 book ai didi

c - 在迭代结果集时删除 sqlite3 中的当前行

转载 作者:行者123 更新时间:2023-12-03 17:05:26 25 4
gpt4 key购买 nike

是否可以迭代结果集,如果满足条件,则删除当前行?

即类似的东西

int rc;
sqlite3_stmt* statement;
sqlite3_exec(db, "BEGIN", 0, 0, 0);

sqlite3_prepare_v2(_db, "SELECT id,status,filename,del FROM mytable", -1, &statement, NULL);

rc = sqlite3_step(statement);
while (rc == SQLITE_ROW){
int id = sqlite3_column_int(statement, 1);
int status = sqlite3_column_int(statement, 2);
const unsigned char* filename = sqlite3_column_int(statement, 3);
int del = sqlite3_column_int(statement, 4);

if (status == 0 || del > 0){
int rc = unlink(filename);
if (rc == 0)
// Now delete the current row
else
// unlink failed, find out why, try again or ... ?
}

rc = sqlite3_step(statement);
}
sqlite3_finalize(statement);
sqlite3_exec(db, "COMMIT", 0, 0, 0);

我可以只调用一个 sql 语句来删除所有符合条件的行,但如果由于某种原因取消链接失败,我不想这样做。

我可以调用一个操作来删除当前行吗?

编辑:
所以有一个特殊的列叫做rowid。我是否只是将其添加为
之前的语句并创建另一个语句,例如“从表中删除 rowid=?”并传入当前的rowid?

那应该行得通吗?这是最好的方法吗?

最佳答案

就效率而言,它可能不是最有效的。如果您要为数千行或更多行的内容执行此操作,则应考虑执行以下一项(或多项)操作:

  • 将查询更改为仅考虑 del > 0 ( SELECT id,status,filename,del FROM mytable WHERE del > 0 ) 的行。您正在使用当前方法执行表扫描,您应该始终尽量避免这种方法。还要确保在 del 列上有一个索引。
  • 建立一个行 id 的中间数组,然后执行以下形式的查询:DELETE FROM table WHERE id IN (?) , 参数化值是您收集的行 ID 连接到逗号分隔的字符串中。根据您正在处理的行数,您可以将删除设置为批量执行(以 1000、5000 等的批量大小删除);因为它是 SQLite,所以请调整到您正在运行的设备。
  • 使用以下表单在创建连接时注册自定义 SQLite 函数:
    void deleteFileFunc(sqlite3_context * context, int argc, sqlite3_value ** argv) {
    assert(argc == 1);
    const char * fileName = sqlite3_value_text(argv[0]);
    int rc = unlink(fileName);
    sqlite3_result_int(context, rc);
    }
    sqlite3_create_function(db, "delete_file", 1, SQLITE3_UTF8, NULL, &deleteFileFunc, NULL, NULL);

  • 然后将您的数据库查询更改为形式 DELETE FROM mytable WHERE del > 0 AND delete_file(filename) == 0 .只有删除成功才会删除该行,不需要遍历结果集。 SQLite 3 创建函数页面: http://www.sqlite.org/c3ref/create_function.html

    关于c - 在迭代结果集时删除 sqlite3 中的当前行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4929103/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com