1.需求
有两张表,条码表和产品详情表,条码表中的rfid为产品表中的rfid外键,要求删除产品表中的相关条目时能实现条码表的级联删除
2.解决
使用qt中的sqlite3自带的级联删除解决这个需求
3.代码
mymain.cpp
#include "mysql.h"
#include
#include
#include
#include
#include
#include
bool createdb(); int main(int argc, char *argv[]) { QApplication a(argc, argv); createdb(); mysql w; w.show(); return a.exec(); } bool createdb() { bool bret = false; //这里创建一个db目录存储数据库文件 QString strdbpath(""); strdbpath = QCoreApplication::applicationDirPath(); strdbpath += "/db"; QDir dir(""); dir.mkpath(strdbpath); strdbpath += "/mysqlite.db"; QSqlDatabase dbset = QSqlDatabase::addDatabase("QSQLITE", "file"); dbset.setDatabaseName(strdbpath); if (!dbset.open()) { //LOG_ALL_ERROR(QStringLiteral("failed open mysqlite.db")); return bret; } QSqlQuery setquery(QSqlDatabase::database("file", true)); if(!setquery.exec("PRAGMA foreign_keys = ON;")) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); QMessageBox::information(nullptr, "errormsg", texterr); return false; } //商品详情表 bret = setquery.exec("create table tb_goods(rfid varchar(33) primary key, name varchar(200) not null)"); if (!bret) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); if (texterr.contains("already exists", Qt::CaseInsensitive)) bret = true; else { //LOG_ALL_ERROR(QStringLiteral("failed create table tb_goods.")); return bret; } } //这里条码对照表和skuid对照表因为可能牵涉到多对多的情况 故没有作为主键 //条码对照表 bret = setquery.exec("create table tb_barcode(id INTEGER PRIMARY KEY AUTOINCREMENT, " "barcode varchar(100) not null, rfid varchar(33) not null, " "FOREIGN KEY(rfid) REFERENCES tb_goods(rfid) ON DELETE cascade)"); if (!bret) { QSqlError sqlerror = setquery.lastError(); QString texterr = sqlerror.text(); if (texterr.contains("already exists", Qt::CaseInsensitive)) bret = true; else { return bret; } } return bret; }
mysql.h
#ifndef MYSQL_H #define MYSQL_H #include
#include
#include "ui_mysql.h" class mysql : public QMainWindow { Q_OBJECT public: mysql(QWidget *parent = 0); ~mysql(); private slots: void on_insertButton_clicked(); void on_deleteButton_clicked(); void on_updateButton_clicked(); private: void reflushModel(); void setAttibutes(QTableView* pView, int nHeaderHeight = 45, int nColumnHeight = 45); private: Ui::mysqlClass ui; QSqlQueryModel m_goodsmodel; QSqlQueryModel m_barcodemodel; }; #endif // MYSQL_H
mysql.cpp
#include "mysql.h" #include
#include
#include
mysql::mysql(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); m_goodsmodel.setQuery("select * from tb_goods", QSqlDatabase::database("file", true)); m_goodsmodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("id")); m_goodsmodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("名称")); m_barcodemodel.setQuery("select * from tb_barcode", QSqlDatabase::database("file", true)); m_barcodemodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("id")); m_barcodemodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("扫描码")); m_barcodemodel.setHeaderData(2, Qt::Horizontal, QStringLiteral("rfid")); ui.goodView->setModel(&m_goodsmodel); ui.skuidView->setModel(&m_barcodemodel); setAttibutes(ui.goodView); setAttibutes(ui.skuidView); } mysql::~mysql() { } void mysql::on_insertButton_clicked() { QSqlQuery setquery(QSqlDatabase::database("file", true)); s