无法在 sqlite3 中使用外键 ID 创建和连接多个表 (C++)

Failed to create and connect multiple tables using FOREIGN KEYS id in sqlite3 (C++)

提问人:Kevinkun 提问时间:8/25/2021 最后编辑:marc_sKevinkun 更新时间:9/11/2021 访问量:68

问:

#include <iostream>

#include <sqlite3.h>

int main()
{
    sqlite3* DB;
    // Create and Open the bank.db databases
    int exit = sqlite3_open("bank.db", &DB);
    if (exit)
    {
        std::cerr << "Error open DB " <<  sqlite3_errmsg(DB) << std::endl;
        return(-1);   
    }

    std::string sql;
    char* messageError;
    
    // THIS WILL SUCCESSFULLY CREATE THE TABLE
    sql = "CREATE TABLE IF NOT EXISTS customer("
        "id INTEGER PRIMARY KEY AUTOINCREMENT,"
        "name      VARCHAR(255) NOT NULL,"
        "dob       TEXT NOT NULL,"
        "gender    TEXT NOT NULL,"
        "address   VARCHAR(50),"
        "handphone TEXT NOT NULL);";

    exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messageError);
    if (exit != SQLITE_OK)
    {
        std::cerr << "Error create table customer!" << std::endl;
        sqlite3_free(messageError);
    }

    // THIS WILL ALWAYS FAILED
    sql = "CREATE TABLE IF NOT EXISTS bank_account("
        "customer_id INTEGER FOREIGN KEY REFERENCES customer(id),"
        "account_number     INT  NOT NULL,"
        "balance            INT  NOT NULL,"
        "username           TEXT NOT NULL,"
        "password           TEXT NOT NULL);";

    exit = sqlite3_exec(DB, sql.c_str(), NULL, 0, &messageError);
    if (exit != SQLITE_OK)
    {
        std::cerr << "Error create table bank_account!" << std::endl;
        sqlite3_free(messageError);
    }

    sqlite3_close(DB);
    return 0;
}

在这里,我尝试练习在C++中使用sqlite3。正如您在上面的代码中看到的,我尝试使用 .id

第一个表,包含用户信息。

第二个表,包含属于用户的银行账户信息(第一个表),并使用 .idFOREIGN KEY REFERENCES customer(id)

当我运行它时,它成功创建了第一个表。但是它总是无法创建第二个表。bank_account

messageError 说: near “FOREIGN”: 语法错误。

有人可以告诉我出了什么问题吗?我看到每个人都以这种方式编写语法。谢谢。

SQLite的

评论

0赞 user253751 8/25/2021
错误消息是什么?
0赞 Kevinkun 8/25/2021
@user253751 错误消息是我在上面的条件下写的:。事实上,它不是在数据库中创建的std::cerr << "Error create table bank_account!" << std::endl; bank.dsb
0赞 user253751 8/25/2021
但是来自sqlite3库的错误消息是什么?它应该告诉你错误是什么。
0赞 Botje 8/25/2021
的最后一个参数是指向 SQLite 将写入其错误消息的位置的指针。请打印出来。sqlite3_exec
0赞 Kevinkun 8/25/2021
你能解释@Botje吗?

答:

0赞 Botje 8/25/2021 #1

您混淆了表和列约束。使用以下方法之一:

表约束:

CREATE TABLE IF NOT EXISTS bank_account
(
    customer_id     INTEGER,
    account_number  INT NOT NULL,
    balance         INT NOT NULL,
    username        TEXT NOT NULL,
    password        TEXT NOT NULL,

    FOREIGN KEY (customer_id) REFERENCES customer(id)
);

或列约束:

CREATE TABLE IF NOT EXISTS bank_account
(
    customer_id    INTEGER REFERENCES customer(id),
    account_number INT  NOT NULL,
    balance        INT  NOT NULL,
    username       TEXT NOT NULL,
    password       TEXT NOT NULL
);