[英]SQLite: in a child table, how can I specify two foreign keys from two parent tables
我正在vs2012中使用c接口實現SQLite。
我有三個表,其中兩個是父母,並且沒有任何鍵將它們鏈接在一起。 第三個是孩子,應該有兩個父表中的兩個外鍵。 我嘗試了以下操作,但無法正常工作,出現以下錯誤:
foreign key contraints failed
這是我的實現:第一個父表:
CREATE TABLE Persons (
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
Name CHAR NULL ,
Age INT NULL
);
第二個父表:
CREATE TABLE Jobs (
Job_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
Description CHAR NULL ,
Country CHAR
);
子表
CREATE TABLE Persons_Jobs (
Title CHAR NULL,
country CHAR NULL,
ID INT ,
Job_ID INT ,
FOREIGN KEY (ID) REFERENCES Persons(ID) ,
FOREIGN KEY (Job_ID) REFERENCES Jobs(Job_ID)
);
請注意,我的表已成功創建,並且前兩個表中的數據也已成功插入。
更新2:
插入語句:
void db_prepareInsertSql(sqlite3 *db){
sqlite3_int64 rowPersonID,rowJobID;
int i =0;
char *sql;
char str[100];
do{
i = i+1;
sprintf_s(str, "INSERT INTO Persons VALUES(NULL,'liena',%d);",i);
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"Persons insertion");
rowPersonID = sqlite3_last_insert_rowid(db);
sprintf_s(str, "INSERT INTO Jobs VALUES(NULL,'Doc','SDN');");
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"Jobs insertion");
rowJobID = sqlite3_last_insert_rowid(db);
\\the error occurs here
sprintf_s(str, "INSERT INTO Persons_Jobs VALUES('A','krt',%d,%d);",rowPersonID,rowJobID);
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"Persons_Jobs insertion");
}
while(i!=10);
}
表創建:
void db_prepareCreateTablesSql(sqlite3 *db){
char *sql;
char str[500];
sprintf_s(str, "PRAGMA foreign_keys = ON;");
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"Enable foriegn-keys feature");
sprintf_s(str, "CREATE TABLE IF NOT EXISTS Persons("
"ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
"Name CHAR NULL , "
"Age INT NULL ); ");
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"table Persons");
sprintf_s(str, "CREATE TABLE IF NOT EXISTS Jobs("
"Job_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
"Description CHAR NULL , "
"Country CHAR )");
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"table Jobs");
sprintf_s(str, "CREATE TABLE IF NOT EXISTS Persons_Jobs("
"Title CHAR NULL , "
"country CHAR NULL , "
"ID INT , "
"Job_ID INT , "
"FOREIGN KEY (ID) REFERENCES Persons(ID),"
"FOREIGN KEY (Job_ID) REFERENCES Jobs(Job_ID)) ;");
sql = str;
db_execute_sql(db,sql);
fprintf(stdout,"table Persons_Jobs");
db_prepareInsertSql(db);
}
當我調試時,我發現了這一點:
所以,我的問題是在子表中,如何從兩個不同的父表中指定兩個外鍵?
兩個表( Persons
和Jobs
)中的兩個插入可能會導致兩個不同的自動遞增值。 因此,您應該使用(偽代碼)將它們都捕獲:
INSERT INTO Persons VALUES(NULL,'liena',1); // 1st table
rowPersonID = sqlite3_last_insert_rowid(db) // catch PersonID
INSERT INTO Jobs VALUES(NULL,'Doc','SDN'); // 2nd table
rowJobID = sqlite3_last_insert_rowid(db) // catch JobID
接着:
INSERT INTO Career VALUES('A','krt',%d,%d)",rowPersonID,rowJobID;
問題在這一行:
sprintf_s(str, "INSERT INTO Persons_Jobs VALUES('A','krt',%d,%d);",rowPersonID,rowJobID);
rowPersonID
和rowJobID
的類型為sqlite3_int64
:
sqlite3_int64 rowPersonID,rowJobID;
這是64位類型,而%d
期望使用32位整數。 您需要將其轉換為整數或使用I64d
格式化64位數字:
sprintf_s(str, "INSERT INTO Persons_Jobs VALUES('A','krt',%I64d,%I64d);", rowPersonID,rowJobID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.