SQLite3学习笔记6:UPDATE(改)+ DELETE(删)数据(C API)

核心知识点

  1. 实现方式 :UPDATE 和 DELETE 依然用sqlite3_exec执行,语法和命令行完全一致,无需回调函数(因为不返回查询结果);
  2. 核心规范:
    • 必须在 SQL 语句中加 WHERE 条件,避免全表修改 / 删除(嵌入式中误操作会导致设备数据全丢);
    • 执行后通过返回值(SQLITE_OK)判断是否成功,无需回调;
    • 对高频修改的参数(如温度),建议基于param_nameid条件操作,保证精准性。

完整 C 代码示例

创建文件sqlite3_c_demo3.c

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// 回调函数:用于验证UPDATE/DELETE后的结果
static int select_callback(void *data, int argc, char **argv, char **azColName)
{
    printf("[%s]\n", (char *)data);
    for (int i = 0; i < argc; i++)
    {
        // 判空避免空指针
        printf("  %s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char *argv[])
{
    sqlite3 *db   = NULL;
    char *err_msg = NULL;
    int ret       = SQLITE_OK;

    // 1. 打开数据库
    ret = sqlite3_open("embedded_db.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 打开数据库失败: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 数据库打开成功\n");

    // 2. 更新数据(温度从26.5→27.0,模拟传感器新读数)
    const char *update_sql = "UPDATE device_params SET param_value = 27.0, update_ts = datetime(CURRENT_TIMESTAMP, '+8 hours') WHERE param_name = 'temp';";
    ret                    = sqlite3_exec(db, update_sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 更新温度失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 温度更新成功(26.5→27.0)\n");

    // 3. 验证更新结果
    const char *select_temp_sql = "SELECT param_name, param_value FROM device_params WHERE param_name = 'temp';";
    ret                         = sqlite3_exec(db, select_temp_sql, select_callback, (void *)"更新后的温度参数", &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 验证更新结果失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }

    // 4. 删除数据(清理湿度数据,模拟无效参数清理)
    const char *delete_sql = "DELETE FROM device_params WHERE param_name = 'humidity';";
    ret                    = sqlite3_exec(db, delete_sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 删除湿度数据失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 湿度数据删除成功\n");

    // 5. 验证删除结果(查询所有数据,确认湿度记录消失)
    const char *select_all_sql = "SELECT * FROM device_params;";
    ret                        = sqlite3_exec(db, select_all_sql, select_callback, (void *)"删除后的所有参数", &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 验证删除结果失败: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return -1;
    }

    // 6. 关闭数据库
    ret = sqlite3_close(db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 关闭数据库失败: %s\n", sqlite3_errmsg(db));
        return -1;
    }
    printf("[INFO] 数据库关闭成功\n");

    return 0;
}

操作步骤

  1. 编译代码(链接 sqlite3 库):
bash 复制代码
gcc sqlite3_c_demo3.c -o sqlite3_c_demo3 -lsqlite3
  1. 运行程序:
bash 复制代码
./sqlite3_c_demo3

输出如下:

bash 复制代码
[INFO] 数据库打开成功
[INFO] 温度更新成功(26.5→27.0)
[更新后的温度参数]
  param_name = temp
  param_value = 27.0

[INFO] 湿度数据删除成功
[删除后的所有参数]
  id = 1
  param_name = temp
  param_value = 27.0
  update_ts = 2026-01-27 13:45:25

[INFO] 数据库关闭成功
  1. 验证结果:
bash 复制代码
sqlite3 embedded_db.db "SELECT * FROM device_params;"

输出如下:

bash 复制代码
1|temp|27.0|2026-01-27 13:45:25
相关推荐
li星野9 分钟前
RAG优化系列:HyDE(假设文档嵌入)——让LLM先写答案再检索
python·学习
知识分享小能手12 分钟前
Flask入门学习教程,从入门到精通,Flask智能租房——用户中心知识点详解(9)
python·学习·flask
魔法阵维护师28 分钟前
从零开发游戏需要学习的c#模块,第三十一章(技能冷却系统 —— 范围爆炸)
学习·游戏·c#
都市放羊28 分钟前
网络小白自学网工——因特网与网络互联技术
网络·笔记·自学
東隅已逝,桑榆非晚33 分钟前
新手入门指南:认识 C 语言文件操作(上)
c语言·开发语言·笔记
暴躁小师兄数据学院37 分钟前
【AI大数据工程师特训笔记】第08讲:集合运算与超级函数
大数据·笔记·sql·ai·postgresql
试剂界的爱马仕40 分钟前
《古董局·终局5:潮生》第 4 章:藤田的棋局
人工智能·学习
searchforAI1 小时前
我的Obsidian知识库,现在可以自动剪藏笔记到本地了
人工智能·笔记·学习·音视频·ai工具·obsidian·视频总结
周末也要写八哥1 小时前
Visual C++6.0下载安装流程及PDF学习手册资源
c++·学习·pdf
坤坤藤椒牛肉面1 小时前
C++学习--类和对象
学习