【问题标题】:Autogenerate composite key in SQLite在 SQLite 中自动生成复合键
【发布时间】:2019-03-25 07:07:16
【问题描述】:

我有一个用于 SQLite 的复合主键 {shop_id, product_id} 现在,我想要一个 product_id 的自动增量值,如果商店 ID 更改,它会重置为 1。基本上,我想要自动生成的复合键 例如

商店 ID 产品 ID

1 1

1 2

1 3

2 1

2 2

3 1

我可以通过自动增量来实现这一点吗?怎么样?

【问题讨论】:

    标签: sqlite android-sqlite composite-primary-key


    【解决方案1】:

    普通 Sqlite 表是使用 64 位整数作为键的 B*-树。这称为rowid。插入行时,如果没有为此明确给出值,则会生成一个值。 INTEGER PRIMARY KEY 列充当此 rowid 的别名。 AUTOINCREMENT 关键字,只能用于所述INTEGER PRIMARY KEY 列,与名称相反,仅更改所述rowid 的计算方式 - 如果您遗漏一个值,无论该关键字是否存在,都会创建一个值,因为它确实是 rowid 并且必须有一个数字。详情here。 (rowid 值通常以递增的顺序生成,但不一定是按顺序生成的,并且不应将其视为行号或类似的东西,顺便说一句)。

    除单个 INTEGER 列之外的任何主键都被视为唯一索引,而 rowid 仍然是真正的主键(除非它是 WITHOUT ROWID 表),并且不会自动生成。所以,不,你不能(轻易地)做你想做的事。

    我可能会设计一个数据库设计,其中有一个商店表、一个产品表,每个表都有自己的 id,以及一个在两者之间建立多对多关系的连接表。这样可以使商店之间的产品 ID 保持相同,这可能不会让人们感到困惑 - 例如,我不希望同一商品在同一连锁店的两个不同商店中具有不同的 SKU。

    类似:

    CREATE TABLE stores(store_id INTEGER PRIMARY KEY
                      , address TEXT
                        -- etc
                       );
    CREATE TABLE product(prod_id INTEGER PRIMARY KEY
                       , name TEXT
                         -- etc
                       );
    CREATE TABLE inventory(store_id INTEGER REFERENCES stores(store_id)
                         , prod_id INTEGER REFERENCES product(prod_id)
                         , PRIMARY KEY(store_id, prod_id)) WITHOUT ROWID;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 2015-07-24
      • 2011-05-28
      • 2015-06-04
      • 2013-10-23
      相关资源
      最近更新 更多