在 SQLite 中自动生成组合键
Autogenerate composite key in SQLite
我有一个用于 SQLite 的复合主键 {shop_id, product_id}
现在,我想要 product_id 的自动增量值,如果商店 ID 更改,它会重置为 1。基本上,我想要自动生成的复合键
例如
商店 ID 产品 Id
1 1
1 2
1 3
2 1
2 2
3 1
我可以用自增实现吗?怎么样?
Normal Sqlite tables 是使用 64 位整数作为键的 B* 树。这叫做rowid. When inserting a row, if a value is not explicitly given for this, one is generated. An INTEGER PRIMARY KEY
column acts as an alias for this rowid. The AUTOINCREMENT
keyword, which can only be used on said INTEGER PRIMARY KEY
column, contrary to the name, merely alters how said rowid is calculated - if you leave out a value, one will be created whether that keyword is present or not, because it's really the rowid and must have a number. Details here。 (rowid 值通常按递增顺序生成,但不一定按顺序生成,并且不应被视为行号或类似的东西,顺便说一句)。
除单个 INTEGER
列之外的任何主键都被视为唯一索引,而 rowid 仍然是真正的主键(除非它是 WITHOUT ROWID table),并且不是自动生成的。所以,不,你不能(轻易地)做你想做的事。
我可能会制定一个数据库设计,其中您有 table 家商店、table 家产品,每个都有自己的 ID,以及一个建立 table 的连接点两者之间的多对多关系。这使商店之间的产品 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 的复合主键 {shop_id, product_id} 现在,我想要 product_id 的自动增量值,如果商店 ID 更改,它会重置为 1。基本上,我想要自动生成的复合键 例如
商店 ID 产品 Id
1 1
1 2
1 3
2 1
2 2
3 1
我可以用自增实现吗?怎么样?
Normal Sqlite tables 是使用 64 位整数作为键的 B* 树。这叫做rowid. When inserting a row, if a value is not explicitly given for this, one is generated. An INTEGER PRIMARY KEY
column acts as an alias for this rowid. The AUTOINCREMENT
keyword, which can only be used on said INTEGER PRIMARY KEY
column, contrary to the name, merely alters how said rowid is calculated - if you leave out a value, one will be created whether that keyword is present or not, because it's really the rowid and must have a number. Details here。 (rowid 值通常按递增顺序生成,但不一定按顺序生成,并且不应被视为行号或类似的东西,顺便说一句)。
除单个 INTEGER
列之外的任何主键都被视为唯一索引,而 rowid 仍然是真正的主键(除非它是 WITHOUT ROWID table),并且不是自动生成的。所以,不,你不能(轻易地)做你想做的事。
我可能会制定一个数据库设计,其中您有 table 家商店、table 家产品,每个都有自己的 ID,以及一个建立 table 的连接点两者之间的多对多关系。这使商店之间的产品 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;