Russian Qt Forum

Qt => Базы данных => Тема начата: starling13 от Сентябрь 07, 2016, 13:18



Название: Qt-5.7 sqlite: Не включается контроль внешних ключей
Отправлено: starling13 от Сентябрь 07, 2016, 13:18
Не могу решить проблему:

Код:
    //...
    QSqlQuery query(_database);
     
    if (!query.exec("PRAGMA foreign_keys = ON"))
    qCritical() << "QSQLQuery::exec";
     
    if (!query.exec("PRAGMA foreign_keys"))
    qCritical() << "QSQLQuery::exec";
     
    if (query.next())
            // Всегда выводит "0", хотя при использовании утилиты командной строки
            // sqlite3 запрос "PRAGMA foreign_keys" возвращает 0 или 1 в соответствии
            // со значением, которое было установлено последним запросом
            // "PRAGMA foreign_keys = ON|OFF"
    qDebug() << query.value(0).toUInt();
     
    if (!query.prepare("DELETE FROM \"MASTER_TABLE\" WHERE ID = :id"))
           qCritical() << "QSQLQuery::prepare";
     
    query.bindValue(":id", id);
    if (!query.exec())
          qCritical() << "QSQLQuery::exec";
     
    // Запись в MASTER_TABLE удаляется, запись в DETAIL_TABLE, содержащая
    // внешний ключ с установленным ON DELETE CASCADE не удаляется.


Название: Re: Qt-5.7 sqlite: Не включается контроль внешних ключей
Отправлено: starling13 от Сентябрь 07, 2016, 14:48
Проблема была в том, что перед попыткой изменения контроля внешних ключей начиналась транзакция.
Как сказано в документации sqlite
Цитировать
It is not possible to enable or disable foreign key constraints in the middle of a multi-statement transaction (when SQLite is not in autocommit mode). Attempting to do so does not return an error; it simply has no effect.

Решено.