我有一个复合主键{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表是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;