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
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();
Теперь я удаляю строку в таблице 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();
}