Sqlite QAbstracteModel::removeRow不删除相关表中的记录
Qt5.14.0,sqlite3。 我创建了两个表:Sqlite QAbstracteModel::removeRow不删除相关表中的记录,sqlite,qt5,Sqlite,Qt5,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, va
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));
在设置
表中,我有如下记录:
abc|foo1|11
abc|foo2|22
abc|foo3|33
def|foo1|11
def|foo2|22
def|foo3|33
在表制造中
:
abc|model1|123
def|model2|234
在我的应用程序中,我创建了两个QSqlTableModel
s以在TableView
s上显示数据:
_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();
现在,我删除制造
表中的一行:
_modelManufacturing->removeRow(ui->listDb->currentIndex().row());
因为我已经在DELETE CASCADE上设置了,我希望设置
表中具有相同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的记录
您误解了删除级联的功能。
您应该期望的是,如果删除了设置
中的一行,则制造
中包含设置
中已删除行的pn
列引用的所有行也将被删除,而不是相反。
因此,父表上的删除将级联到包含此父表中列引用的表。
您可以找到更多信息。设置PRAGMA foreign\u keys=ON
,因为它的默认值是OFF
。我已经将它设置为ON,question update。实际上,我发现了这个错误:QSqlError(“1”,“无法执行语句”,“外键不匹配-\“制造”引用“设置”)
。也许是我的钥匙出了什么问题?看我的答案……是的,我刚换了钥匙。