Вставить данные с ограничением внешнего ключа не работает? [SQLite с C ++] - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь проверить, существует ли запись, которую пользователь хочет удалить, с помощью sqlite, создавая внешний ключ во временной таблице, ссылающейся на исходную таблицу, к сожалению, это не работает, я что-то упускаю из виду?

void enableForeignKeys()
    {
        const char* sql = "PRAGMA foreign_keys = ON;";

        int writeToDB = sqlite3_exec(db, sql, callback, 0, &errorMessage);

        if (writeToDB != SQLITE_OK) {
            cerr << "SQL error: %s" << &errorMessage << endl;
            sqlite3_free(errorMessage);
        }
        else {
            sql = "PRAGMA foreign_keys;";
            sqlite3_exec(db, sql, callback, 0, &errorMessage);
            return;
        }
    };

bool verifyEntryChoice(string referenceTable, string referencePrimaryKeyColumn, string chosenID)
    {
        sqlite3_open(filePath, &db);
        enableForeignKeys();

        string createTableQuery = "CREATE TEMP TABLE temp("
            "tempID INT UNIQUE NOT NULL,"
            "FOREIGN KEY(tempID) REFERENCES Customer(CustomerID));";

        const char* createTableSQL = &createTableQuery[0];
        cout << createTableSQL << endl;

        int writeToDB = sqlite3_exec(db, createTableSQL, callback, 0, &errorMessage);

        if (writeToDB != SQLITE_OK) {
            cerr << "Error" << endl;
            return false;
        }
        else cout << "Table created" << endl;

        string insertQuery = "INSERT INTO temp(tempID)"
            " VALUES(1);";

        const char* insertSQL = &insertQuery[0];
        cout << insertSQL << endl;

        writeToDB = sqlite3_exec(db, insertSQL, callback, 0, &errorMessage);

        if (writeToDB != SQLITE_OK) {
            cerr << "Wrong ID!" << endl;
            return false;
        }
        else {
            cout << "ID verified" << endl;
            return true;
        }
    }

Мне нужно добавить больше слов, чтобы это было опубликовано, извините, если это человеческая ошибка, а не что-то более сложное!

1 Ответ

1 голос
/ 06 марта 2020

У вас не может быть внешнего ключа, который ссылается на таблицу в другой присоединенной базе данных. Поэтому таблицы в схеме базы данных temp, используемые для временных таблиц, не могут использовать таблицы в схеме базы данных main в качестве родительской таблицы для внешних ключей.

Если вы попытаетесь это сделать:

sqlite> pragma foreign_keys=on;
sqlite> create table foo(id integer primary key, x);
sqlite> create temp table bar(id integer primary key, foo_id integer references foo(id));
sqlite> insert into foo values (1, 'dog');
sqlite> insert into bar values (1, 1);
Error: no such table: temp.foo

Как видите, он ищет в схеме temp родительскую таблицу и не находит ее. Попытка квалифицировать таблицу не работает:

sqlite> create temp table bar(id integer primary key, foo_id integer references main.foo(id));
Error: near ".": syntax error
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...