【问题标题】:Autogenerate composite key in SQLite在 SQLite 中自动生成复合键
【发布时间】:2019-03-25 07:07:16
【问题描述】:
我有一个用于 SQLite 的复合主键 {shop_id, product_id}
现在,我想要一个 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】:
普通 Sqlite 表是使用 64 位整数作为键的 B*-树。这称为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;