这是将查询结果从两个表插入第三个表的正确方法吗?

时间:2013-08-08 18:10:38

标签: qt sqlite

我一直在寻找(Inserting from two other tables into a third),但我没有看到这个简单问题的明确答案。下面的代码似乎有用,但它很笨拙,我想知道我是否工作太辛苦了。

任务:

INSERT id关键字“blue”FROM表“keywords” id of image FROM table“images”WHERE id = 1 as FOREIGN_KEYS into third table“images_keywords”表“images_keywords”只有这两个字段,两者都定义为FOREIGN_KEYS。

我想知道:

  • 我这样做效率低(或者只是计划错误......)?
  • 我是否正在处理FOREIGN_KEYS 正确?

void MainWindow::on_addKeywordBtn_clicked()
{
    // find keyword = "blue"
    QSqlQuery keywordQuery(db);
    keywordQuery.prepare("SELECT id, keyword FROM keywords WHERE keyword = ?");
    keywordQuery.addBindValue(QString("blue"));
    keywordQuery.exec();

    // find image with id = 1
    QSqlQuery imageQuery(db);
    imageQuery.prepare("SELECT id FROM images WHERE id = ?");
    imageQuery.addBindValue(1);
    imageQuery.exec();

    QSqlQuery insertQuery(db);
    while (keywordQuery.next() && imageQuery.next()) {

        insertQuery.prepare( "INSERT INTO images_keywords (image_id, keyword_id) VALUES (:image_id, :keyword_id)" );
        insertQuery.bindValue( ":image_id", imageQuery.record().value("id").toInt());
        insertQuery.bindValue( ":keyword_id", keywordQuery.record().value("id").toInt());
        bool result= insertQuery.exec();

        if (!result)  qDebug() <<  insertQuery.lastError().text();
    }
}

1 个答案:

答案 0 :(得分:0)

这看起来很正确,我假设您已经填充了关键字和图像表。我只是提出了一些改进流程的建议。

在我的应用程序中进行任何数据交互时,我创建了一个通常名为DAL的数据访问层类,以便更轻松地重用代码。如果您有表示关键字和图像的对象,则可以将对象传递给每个方法,并对对象本身执行CRUD操作。可以把它想象成一种非常基本的对象关系映射器。

在下面的代码中,如果您已有图像ID,则可能不需要GetImage。在检索关键字ID后,您只需将图像ID传递给InsertImageKeyword。

int DAL::GetKeyword(QString keyword)
{
    // get ID
    QSqlQuery keywordQuery(db);
    keywordQuery.prepare("SELECT id FROM keywords WHERE keyword = ?");
    keywordQuery.addBindValue(image);
    keywordQuery.exec();
    int id = -1;
    if(keywordQuery.next())
        id = keywordQuery.record().value("id").toInt();
    return id;
}

int DAL::GetImage(QString image)
{
    // get ID
    QSqlQuery imageQuery(db);
    imageQuery.prepare("SELECT id FROM images WHERE image = ?");
    imageQuery.addBindValue(image);
    imageQuery.exec();
    int id = -1;
    if(imageQuery.next())
        id = imageQuery.record().value("id").toInt();
    return id;
}

bool DAL::InserImageKeyword(int imageId, int keywordId)
{
    QSqlQuery insertQuery(db);
    insertQuery.prepare( "INSERT INTO images_keywords (image_id, keyword_id) VALUES (:image_id, :keyword_id)" );
    insertQuery.bindValue( ":image_id", imageId);
    insertQuery.bindValue( ":keyword_id", keywordId);

    bool result= insertQuery.exec();

    if (!result)  
        qDebug() <<  insertQuery.lastError().text();

    return result;
}