在SQLite中自动生成组合键

时间:2019-03-25 07:07:17

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

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

商店ID产品ID

1 1

1 2

1 3

2 1

2 2

3 1

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

1 个答案:

答案 0 :(得分:3)

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

除单个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;