Qt5.14.0,sqlite3。我创建了两个表:
CREATE TABLE manufacturing (pn TEXT PRIMARY KEY, model TEXT NOT NULL, sn TEXT, FOREIGN KEY (pn) REFERENCES settings (pn) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE settings (pn TEXT NOT NULL, name TEXT NOT NULL, value TEXT, PRIMARY KEY (pn, name));
在settings
表中,我有一些这样的记录:
abc|foo1|11
abc|foo2|22
abc|foo3|33
def|foo1|11
def|foo2|22
def|foo3|33
在表manufacturing
:中
abc|model1|123
def|model2|234
在我的应用程序中,我创建了两个QSqlTableModel
在TableView
上显示数据:
_modelManufacturing = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelManufacturing->setTable("manufacturing");
_modelManufacturing->select();
ui->tableManufacturing->setModel(_modelManufacturing);
_modelSettings = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelSettings->setTable("settings");
ui->tableSettings->setModel(_modelSettings);
顺便说一下,我根据需要过滤第二个表:
_modelSettings->setFilter("pn="" + ui->linePN->text() + """);
_modelSettings->select();
现在我删除manufacturing
表中的一行:
_modelManufacturing->removeRow(ui->listDb->currentIndex().row());
因为我已经设置了ON DELETE CASCADE
标志,所以我希望settings
表中具有相同pn
的记录也应该被删除。相反,他们没有受到影响。
为什么?当我删除第一个表中的相应记录时,如何自动删除它们?
更新
以下是我如何打开数据库:
bool ManagerDatabase::openDatabase(QString name)
{
QString filename = qApp->applicationDirPath() + "/" + name + ".sqlite";
if (!QFile::exists(filename)) return false;
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "dbData");
db.setDatabaseName(filename);
bool ret = db.open();
if (ret) enableForeignKeys();
return ret;
}
void ManagerDatabase::enableForeignKeys()
{
QSqlQuery query(QSqlDatabase::database("dbData"));
query.prepare("PRAGMA foreign_keys = ON;");
query.exec();
}
。。。因为我已经设置了ON DELETE CASCADE标志,所以我希望应该删除设置表中具有相同pn的记录。。。
您误解了ON DELETE CASCADE
的作用
您应该期望的是,如果settings
中的一行被删除,那么manufacturing
中所有包含settings
中已删除行的列pn
引用的行也将被删除,而不是相反
因此,父表上的删除会级联到包含此父表中列的引用的表
您可以在此处找到更多信息。