我有一个复合主键{shop_id,PRODUCT_ID} SQLite的现在,我要为PRODUCT_ID自动递增值,如果店铺ID改变其重置为1。 基本上,我想要自动生成的复合键如
店铺ID产品编号
1 1
1 2
1 3
2 1
2 2
3 1
我可以自动递增实现这一目标? 怎么样?
我有一个复合主键{shop_id,PRODUCT_ID} SQLite的现在,我要为PRODUCT_ID自动递增值,如果店铺ID改变其重置为1。 基本上,我想要自动生成的复合键如
店铺ID产品编号
1 1
1 2
1 3
2 1
2 2
3 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;