提问人:Kevinkun 提问时间:8/25/2021 最后编辑:marc_sKevinkun 更新时间:9/11/2021 访问量:68
无法在 sqlite3 中使用外键 ID 创建和连接多个表 (C++)
Failed to create and connect multiple tables using FOREIGN KEYS id in sqlite3 (C++)
问:
#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
第一个表,包含用户信息。
第二个表,包含属于用户的银行账户信息(第一个表),并使用 .id
FOREIGN KEY REFERENCES customer(id)
当我运行它时,它成功创建了第一个表。但是它总是无法创建第二个表。bank_account
messageError 说: near “FOREIGN”: 语法错误。
有人可以告诉我出了什么问题吗?我看到每个人都以这种方式编写语法。谢谢。
答:
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
);
评论
std::cerr << "Error create table bank_account!" << std::endl;
bank.dsb
sqlite3_exec