我一直在寻找(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。
我想知道:
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();
}
}
答案 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;
}