我试图在c ++ sqlite3中编写多对多的关系。
在下图中,
许多经理正在增加就业机会
我的创建表语句
"CREATE TABLE Manager(" \
"manager_id INTEGER PRIMARY KEY NOT NULL,"\
"name varchar(45) NOT NULL);"
"CREATE TABLE jobs ("
"jobId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"\
"jobTitle varchar(45) NOT NULL);"
"CREATE TABLE Add ("
"manager_id,jobId INTEGER PRIMARY KEY NOT NULL,"\
"date varchar(45) NOT NULL,"\
"FOREIGN KEY(manager_id) REFERENCES Manager(manager_id),"\
"FOREIGN KEY(job_id) REFERENCES jobs(job_id));";
我的经理表填充了以下信息
1|john
2|bob
让我们说经理john已经添加了两个职位,jobTitle jobA和jobB
然后我的插入语句代码将如下所示。http://pastebin.com/0E8CzPgX
然后我的作业表填充了以下信息
1|jobA
2|jobB
最后一步是取john(经理id = 1)和两个jobsId(1,2)的id并将其添加到里面 添加表。我不知道应该如何编码 这样add表就会变成这样。
添加表格
manager_id|job_id|date
1 | 1 |30-01-2014
1 | 2 |30-01-2014
请告知。谢谢
答案 0 :(得分:1)
你的意思是
sql = "INSERT INTO Add(manager_id,jobId,date) VALUES (?,?,?);";
您的问题似乎是您将jobID定义为表Add的主键,这是您不需要的。
jobId INTEGER PRIMARY KEY NOT NUL
数据库中多对多关系的常用方法是包含一个中间表。
这个中间表(我们称之为Manager_jobs)至少有两列,都通过外键引用其他表。第一个属性是Manager的主键,第二个属性是作业的主键。
每次添加作业时,只需分别使用外键向Manager_jobs添加一个条目。
所以,Manager_jobs看起来像这样:
ManagerID | JobID
==========|======
4 | 2
3 | 2
4 | 1
正如您所看到的,Manager_jobs可以编码Manager分配了多个作业,反之亦然。
当然,这种方法要求您为两个数据表都使用某种形式的主键。