自动生成SQLite中复合键(Autogenerate composite key in SQLit

2019-10-16 12:42发布

我有一个复合主键{shop_id,PRODUCT_ID} SQLite的现在,我要为PRODUCT_ID自动递增值,如果店铺ID改变其重置为1。 基本上,我想要自动生成的复合键如

店铺ID产品编号

1 1

1 2

1 3

2 1

2 2

3 1

我可以自动递增实现这一目标? 怎么样?

Answer 1:

正常SQLite的表是使用64位整数作为关键B * - 树。 这就是所谓的ROWID 。 当插入行,如果值不明确这个给定的,一个是产生。 一个INTEGER PRIMARY KEY列充当用于此ROWID的别名。 在AUTOINCREMENT关键字,它只能在使用说INTEGER PRIMARY KEY列,违背了名,只是改变是怎么说的rowid的计算-如果你离开了一个值,一会创建关键字是否存在或不存在,因为它是真正的ROWID,必须有一个数字。 细节在这里 。 (ROWID值以增加通常生成的,但不一定是连续的,顺序,并且不应该被视为一个行号或类似的东西,顺便说一句)。

不是单一的任何主键等INTEGER列被视为唯一索引,而rowid是真正的主键(除非它是一个无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;


文章来源: Autogenerate composite key in SQLite