QAbstractItemModel::removeRow不删除相关表中的记录



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

在我的应用程序中,我创建了两个QSqlTableModelTableView上显示数据:

_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引用的行也将被删除,而不是相反
因此,父表上的删除会级联到包含此父表中列的引用的表
您可以在此处找到更多信息。

相关内容

  • 没有找到相关文章

最新更新