Не работает insert into в таблицу

У меня есть приложение клиент/серверное, типо мессенджера, и при запросе на создания нового диалога sql запрос выдает ошибку:

auto newDialogQuery = db->query("INSERT INTO Dialogs (channelid, lastMessage, lastMessageDate, companionfirst, companionsecond)"
              " VALUES (:channelid, :lastMessage, :lastMessageDate, :companionfirst, :companionsecond);");
newDialogQuery.bindValue(":channelid", idChannel);
newDialogQuery.bindValue(":lastMessage", QString("Start chatting!"));
newDialogQuery.bindValue(":lastMessageDate", time);
newDialogQuery.bindValue(":companionfirst", account->getUserInfo()- 
>getUserLogin());
newDialogQuery.bindValue(":companionsecond", companionLogin);
if (!db->execute(newDialogQuery)) {
    *request << replyes::internalServerError;
    return;
}

База данных:

CREATE TABLE IF NOT EXISTS Users (
    login TEXT UNICAL PRIMARY KEY,
    username TEXT,
    password TEXT,
    icon TEXT
);

CREATE TABLE IF NOT EXISTS ChannelsIds (
    channelid TEXT UNICAL PRIMARY KEY,
    lastMessage TEXT,
    lastMessageDate datetime
);

CREATE TABLE IF NOT EXISTS Dialogs (
    channelid TEXT UNICAL PRIMARY KEY,
    lastMessage TEXT,
    lastMessageDate datetime,
    companionfirst TEXT,
    companionsecond TEXT,

    FOREIGN KEY (companionfirst) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (companionsecond) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE
    FOREIGN KEY (lastMessage) REFERENCES ChannelsIds(lastMessage) ON DELETE CASCADE ON UPDATE CASCADE
    FOREIGN KEY (lastMessageDate) REFERENCES ChannelsIds(lastMessageDate) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS Messages (
    messageid TEXT UNICAL PRIMARY KEY,
    channelid TEXT,
    owner TEXT,
    message TEXT,
    messageDate datetime,
    FOREIGN KEY (owner) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS Members (
    channelid TEXT,
    memberid TEXT,
    FOREIGN KEY (channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (memberid) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE
);

lastError выдает следующее: "Parameter count mismatch"

Может неправильно как-то написал запрос, но аишка мне выдала такой же запрос который у меня был (первый запрос в этом вопросе копипаста ответа аишки). Нагуглил что эта ошибка выдается вообще почти всегда и при любых ошибках, так что не знаю куда копать. Думаю может быть что-то связано с foreign key (они кстати включены через pragma директиву первым запросом), в бд в таблице Users входные значения присутствуют (и входные значения я посмотрел через qDebug, они в порядке), а в ChannelsIds перед этим запросом создается запись, успешно. На всякий ее sql тоже приложу:

auto channelInsert = db->query("insert into ChannelsIds (channelid, lastMessage, lastMessageDate) VALUES (:channelid, :lastMessage, :lastMessageDate);");
    channelInsert.bindValue(":channelid", idChannel);
    channelInsert.bindValue(":lastMessage", QString("Start chatting!"));
    channelInsert.bindValue(":lastMessageDate", time);
    if (!db->execute(channelInsert)) {
        *request << replyes::internalServerError;
        return;
    }

Полностью код для маршрута пакета создания диалога:

    QSharedPointer<data::Account> account = managers::AccountsManager::instance()->getAccount(session()->token());
    if (!account) {
        *request << replyes::invalidToken;
        return;
    }
    QString companionLogin;
    *request >> companionLogin;
    if (companionLogin == account->getUserInfo()->getUserLogin()) {
        *request << replyes::channelWithSelfName;
        return;
    }
    qDebug() << "Companion login:" << companionLogin;

    auto db = Worker::databaseDevice();
    auto result = isDialogExists(account->getUserInfo()->getUserLogin(), companionLogin, db);
    if (!result.has_value()) {
        *request << replyes::internalServerError;
        return;
    }
    if (result.value() == true) {
        *request << replyes::channelAlreadyExists;
        return;
    }

    const QUuid idChannel = QUuid::createUuid();
    const QDateTime time = QDateTime::currentDateTime();
    qDebug() << "Channel id:" << idChannel;
    qDebug() << "Time:" << time;
    {
        auto channelInsert = db->query("insert into ChannelsIds (channelid, lastMessage, lastMessageDate) VALUES (:channelid, :lastMessage, :lastMessageDate);");
        channelInsert.bindValue(":channelid", idChannel);
        channelInsert.bindValue(":lastMessage", QString("Start chatting!"));
        channelInsert.bindValue(":lastMessageDate", time);
        if (!db->execute(channelInsert)) {
            *request << replyes::internalServerError;
            return;
        }
    }

    {
        auto newDialogQuery = db->query("INSERT INTO Dialogs (channelid, lastMessage, lastMessageDate, companionfirst, companionsecond)"
              " VALUES (:channelid, :lastMessage, :lastMessageDate, :companionfirst, :companionsecond);");
        qDebug() << "User login:" <<account->getUserInfo()->getUserLogin();
        newDialogQuery.bindValue(":channelid", idChannel);
        newDialogQuery.bindValue(":lastMessage", QString("Start chatting!"));
        newDialogQuery.bindValue(":lastMessageDate", time);
        newDialogQuery.bindValue(":companionfirst", account->getUserInfo()->getUserLogin());
        newDialogQuery.bindValue(":companionsecond", companionLogin);
        if (!db->execute(newDialogQuery)) {
            *request << replyes::internalServerError;
            return;
        }
    }
    
    {
        auto membersQuery = db->query("INSERT INTO Members (memberid, channelid) VALUES (:memberid, :channelid)");
        membersQuery.bindValue(":memberid", account->getUserInfo()->getUserLogin());
        membersQuery.bindValue(":channelid", idChannel);
        if (!db->execute(membersQuery)) {
            *request << replyes::internalServerError;
            return;
        }
        membersQuery.bindValue(":memberid", companionLogin);
        if (!db->execute(membersQuery)) {
            *request << replyes::internalServerError;
            return;
        }
    }
    

    serialize::Dialog dialog;
    dialog.lastMessage = "Start chatting!";
    dialog.lastMessageDate = time;
    dialog.id = idChannel;
    std::optional<serialize::UserProfile> userProfile = loadUserProfile(companionLogin, db).value();
    if (!userProfile.has_value()) {
        *request << replyes::internalServerError;
        return;
    }
    dialog.companion = std::move(userProfile.value());
    *request << dialog << replyes::succesfull;

Логи от сервера при получении пакета

[18:01:47.962 0x25185f0 D] quty::server::handlers::ChannelsHandler::createDialog:168 - Companion login: "123123"
[18:01:47.963 0x25185f0 D] quty::server::handlers::ChannelsHandler::createDialog:183 - Channel id: QUuid("{6013f70b-27ab-41c8-be48-c6c82c161e7d}")
[18:01:47.963 0x25185f0 D] quty::server::handlers::ChannelsHandler::createDialog:184 - Time: QDateTime(2024-11-28 18:01:47.963 GMT+3 Qt::LocalTime)
[18:01:47.966 0x25185f0 D] quty::server::handlers::ChannelsHandler::createDialog:199 - User login: "1"
[18:01:47.966 0x25185f0 C] quty::server::database::DatabaseDevice::execute:43 - SQL error: "Parameter count mismatch"
[18:01:47.966 0x25185f0 C] quty::server::database::DatabaseDevice::execute:44 - SQL query: "INSERT INTO Dialogs (channelid, lastMessage, lastMessageDate, companionfirst, companionsecond) VALUES (:channelid, :lastMessage, :lastMessageDate, :companionfirst, :companionsecond);"

Таблица Users: Таблица Users

Таблица ChannelsIds: Таблица ChannelsIds

UPD: Изменил sql на создание таблиц с тестовыми insert-ами, теперь ошибка следующая: "createTables.sql" SQL statement error detail: "foreign key mismatch - \"Dialogs\" referencing \"ChannelsIds\" Unable to execute statement"

Сам sql:

CREATE TABLE IF NOT EXISTS Users (
    login TEXT UNIQUE PRIMARY KEY,
    username TEXT,
    password TEXT,
    icon TEXT
);

CREATE TABLE IF NOT EXISTS ChannelsIds (
    channelid TEXT NOT NULL UNIQUE,
    lastMessage TEXT,
    lastMessageDate TEXT,
    PRIMARY KEY(channelid, lastMessage, lastMessageDate)
);

CREATE TABLE IF NOT EXISTS Dialogs (
    channelid TEXT NOT NULL UNIQUE,
    lastMessage TEXT,
    lastMessageDate TEXT,
    companionfirst TEXT,
    companionsecond TEXT,

    PRIMARY KEY(channelid),
    FOREIGN KEY(channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(companionfirst) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(companionsecond) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(lastMessage) REFERENCES ChannelsIds(lastMessage) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(lastMessageDate) REFERENCES ChannelsIds(lastMessageDate) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS Messages (
    messageid TEXT UNIQUE,
    channelid TEXT,
    owner TEXT,
    message TEXT,
    messageDate TEXT,
    PRIMARY KEY(messageid),
    FOREIGN KEY(channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(owner) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE IF NOT EXISTS Members (
    channelid TEXT,
    memberid TEXT,
    FOREIGN KEY(channelid) REFERENCES ChannelsIds(channelid) ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY(memberid) REFERENCES Users(login) ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO Users(login, username, password, icon) VALUES('1', '1', '123', '123');
INSERT INTO Users(login, username, password, icon) VALUES('123', '123', '123', '123');

INSERT INTO ChannelsIds(channelid, lastMessage, lastMessageDate) VALUES('112233', '1', '123');
INSERT INTO Dialogs(channelid, lastMessage, lastMessageDate, companionfirst, companionsecond) VALUES('112233', '1', '123', '1', '123');

Ответы (1 шт):

Автор решения: myname

Решил проблему, удалив столбцы lastMessage и lastMessageDate в Dialogs, оказывается недостаточно, чтобы столбец был primary key, он еще должен быть unique, чтобы foreign key мог на него ссылаться. Теперь отдельным запросом подгружаю сообщение из ChannelsIds.

→ Ссылка