sqlite - 在 SQLite 中自动生成复合键

标签 sqlite android-sqlite composite-primary-key

我有一个用于 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/

相关文章:

mysql - 按组合键的一部分选择所有与组合键的其余部分匹配的行?

sqlite 选择查询

Javascript - 返回前重置值

php - SQL准备语句execute()错误

android-sqlite - Room 数据库处理 POJO 和多个表中的继承

android.database.sqlite.SQLiteException : near "?": syntax error (code 1):

android-sqlite - Android with Room - 如何将外键设置为可空

python - 为什么 SQLite 会插入重复的复合主键?

SQL - 这种关系可以有一个主键吗?

java - SQLite数据库读取错误 'no such file or directory '