在SQLite中自动生成复合键

问题描述 投票:2回答:1

我有一个复合主键{shop_id,product_id}用于SQLite Now,我想要一个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个回答
3
投票

正常的Sqlite表是B * -trees,它们使用64位整数作为键。这被称为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;
© www.soinside.com 2019 - 2024. All rights reserved.