在其他表中使用INT PRIMARY KEY值,同一数据库调用

时间:2011-01-24 22:24:38

标签: database database-design tags sqlite

我在SQLite3中创建了以下表来标记项目(在阅读this great response之后)。标签保存在表格中,而ItemTags将显示一个项目(来自表格项目)与一个或多个标签(来自表格标签)之间的关系。

CREATE TABLE Items ItemID INTEGER PRIMARY KEY, Title TEXT, Comment TEXT;    
CREATE TABLE Tags TagID INTEGER PRIMARY KEY, Title TEXT;
CREATE TABLE ItemsTags ItemID INTEGER, TagID INTEGER;

提交新行时,用户将输入标题和注释(将保存在表项目中),并从一个或多个标签中选择(从表格中选择/添加标签)。到目前为止,我已经设法做到了这一点:

INSERT INTO Items (Title, Comment) VALUES ('First title', 'First comment');

我希望列ItemID为INTEGER PRIMARY KEY,但同时,我希望在同一个调用中访问该值。比如说,我的表格标签有以下布局:

TagID | Title
------|----------
    1 | First tag
    2 | Second tag

并且我想用TagID 1和2标记上面提到的语句(“First title”,其标题ID为1),并将关系保存到表ItemsTags。完成后,我希望进行以下更改:

Table: Items

TitleID | Title       | Comment
--------|-------------|--------------
      1 | First title | First comment

Table: Tags

TagID | Title
------|----------
    1 | First tag
    2 | Second tag

Table: ItemsTags

TagID | ItemID
------|---------
    1 | 1
    2 | 1

我怎样才能做到这一点?提前谢谢!

1 个答案:

答案 0 :(得分:3)

您不能通过一次调用数据库将行插入两个单独的表中,也不能通过一次调用将两行插入同一个表中。在这种情况下你需要四个:

 INSERT INTO Items (Title, Comment) VALUES ('First title', 'First comment');
 SELECT last_insert_rowid() -- To get last inserted id
 INSERT INTO  ItemTags (TagID, ItemID) VALUES (1, :LastID)
 INSERT INTO  ItemTags (TagID, ItemID) VALUES (2, :LastID)

如果将它们全部放在一个事务中,它们将同时被提交,只有一个锁定放在数据库文件中。