【问题标题】:Use INT PRIMARY KEY value in other table, same database call在其他表中使用 INT PRIMARY KEY 值,相同的数据库调用
【发布时间】:2011-01-24 22:24:37
【问题描述】:

我在 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 标记上述语句(“第一个标题”,其 TitleID 为 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

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

【问题讨论】:

    标签: database database-design tags sqlite


    【解决方案1】:

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

     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)
    

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

    【讨论】:

    • 谢谢!我删除了 SELECT 语句并将其替换为 INSERT INTO ItemTags (TagID, ItemID) VALUES (1, (last_insert_rowid());,现在一切似乎都正常了!
    • 谨慎使用该方法。只要您不向 ItemTags 添加自动增量列就可以了。如果这样做,则第二次插入 ItemTags 将使用第一次插入的自动增量值,而不是 Items 表中的值。
    • 是的,我明白了。 ItemTags 应该只显示一个项目和一个或多个标签之间的关系,所以应该没有问题。使用这种方法时,我还有什么需要注意的吗?
    • 不,但我会小心在 last_insert_rowid() 生成后尽快保护它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多