数据库分表:多个keys关联一个value

目的:为了解决重复value的问题,节约存储内存 。

qt版本:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建 SQLite 数据库文件
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("example.db");

    if (!db.open()) {
        qDebug() << "Error: Unable to open database";
        return -1;
    }

    // 创建 key 表
    QSqlQuery query;
    if (!query.exec("CREATE TABLE IF NOT EXISTS keys (keyName TEXT)")) {
        qDebug() << "Error: Unable to create keys table";
        return -1;
    }

    // 创建 value 表
    if (!query.exec("CREATE TABLE IF NOT EXISTS values (id INTEGER PRIMARY KEY, value TEXT)")) {
        qDebug() << "Error: Unable to create values table";
        return -1;
    }

    // 创建关联表
    if (!query.exec("CREATE TABLE IF NOT EXISTS key_value_relation (keyName TEXT, valueId INTEGER)")) {
        qDebug() << "Error: Unable to create key_value_relation table";
        return -1;
    }

    // 插入示例数据
    if (!query.exec("INSERT INTO keys (keyName) VALUES ('key1')")) {
        qDebug() << "Error: Unable to insert data into keys table";
        return -1;
    }

    if (!query.exec("INSERT INTO keys (keyName) VALUES ('key2')")) {
        qDebug() << "Error: Unable to insert data into keys table";
        return -1;
    }

    if (!query.exec("INSERT INTO values (value) VALUES ('value1')")) {
        qDebug() << "Error: Unable to insert data into values table";
        return -1;
    }

    if (!query.exec("INSERT INTO key_value_relation (keyName, valueId) VALUES ('key1', 1)")) {
        qDebug() << "Error: Unable to insert data into key_value_relation table";
        return -1;
    }

    if (!query.exec("INSERT INTO key_value_relation (keyName, valueId) VALUES ('key2', 1)")) {
        qDebug() << "Error: Unable to insert data into key_value_relation table";
        return -1;
    }

    // 查询示例数据
    if (!query.exec("SELECT keys.keyName, values.value FROM keys INNER JOIN key_value_relation ON keys.keyName = key_value_relation.keyName INNER JOIN values ON key_value_relation.valueId = values.id")) {
        qDebug() << "Error: Unable to select data from tables";
        return -1;
    }

    while (query.next()) {
        QString key = query.value(0).toString();
        QString value = query.value(1).toString();
        qDebug() << "Key: " << key << ", Value: " << value;
    }

    // 关闭数据库连接
    db.close();

    return a.exec();
}

C++版本:

#include <iostream>
#include <sqlite3.h>

int main() {
    sqlite3* db;
    char* errMsg = 0;
    int rc = sqlite3_open("example.db", &db);

    if (rc) {
        std::cerr << "Error: Unable to open database" << std::endl;
        return -1;
    }

    rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS keys (keyName TEXT)", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to create keys table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS values (id INTEGER PRIMARY KEY, value TEXT)", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to create values table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS key_value_relation (keyName TEXT, valueId INTEGER)", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to create key_value_relation table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "INSERT INTO keys (keyName) VALUES ('key1')", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to insert data into keys table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "INSERT INTO keys (keyName) VALUES ('key2')", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to insert data into keys table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "INSERT INTO values (value) VALUES ('value1')", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to insert data into values table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "INSERT INTO key_value_relation (keyName, valueId) VALUES ('key1', 1)", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to insert data into key_value_relation table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    rc = sqlite3_exec(db, "INSERT INTO key_value_relation (keyName, valueId) VALUES ('key2', 1)", 0, 0, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to insert data into key_value_relation table" << std::endl;
        sqlite3_free(errMsg);
        return -1;
    }

    sqlite3_stmt* stmt;
    rc = sqlite3_prepare_v2(db, "SELECT keys.keyName, values.value FROM keys INNER JOIN key_value_relation ON keys.keyName = key_value_relation.keyName INNER JOIN values ON key_value_relation.valueId = values.id", -1, &stmt, 0);
    if (rc != SQLITE_OK) {
        std::cerr << "Error: Unable to select data from tables" << std::endl;
        return -1;
    }

    while (sqlite3_step(stmt) == SQLITE_ROW) {
        std::cout << "Key: " << sqlite3_column_text(stmt, 0) << ", Value: " << sqlite3_column_text(stmt, 1) << std::endl;
    }

    sqlite3_finalize(stmt);
    sqlite3_close(db);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值