我有一个用于 SQLite 的复合主键 {shop_id, product_id}
现在,我想要一个 product_id 的自动增量值,如果商店 ID 更改,它会重置为 1。基本上,我想要自动生成的复合键
例如
店铺 ID 产品 ID
1 1
1 2
1 3
2 1
2 2
3 1
我可以通过自动增量来实现这一点吗?如何?
最佳答案
普通的 Sqlite 表是使用 64 位整数作为键的 B*-tree。这称为 rowid .插入行时,如果没有为此明确给出值,则会生成一个值。一个 INTEGER PRIMARY KEY
column 充当此 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;
关于sqlite - 在 SQLite 中自动生成复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55332718/