Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQLite中自动生成复合密钥_Sqlite_Android Sqlite_Composite Primary Key - Fatal编程技术网

在SQLite中自动生成复合密钥

在SQLite中自动生成复合密钥,sqlite,android-sqlite,composite-primary-key,Sqlite,Android Sqlite,Composite Primary Key,我有一个SQLite的复合主键{shop_id,product_id} 现在,我想要一个product_id的自动增量值,如果店铺id被更改,它将重置为1。基本上,我想要自动生成的复合键 e、 g 店铺ID产品ID 11 1 2 13 2.1 2.2 3.1 我可以用自动增量来实现这一点吗?如何使用?普通Sqlite表是使用64位整数作为键的B*树。这就是所谓的。插入行时,如果没有为此显式给定值,则会生成一个值。INTEGER主键列用作此rowid的别名。AUTOINCREMENT关键字只能用于

我有一个SQLite的复合主键{shop_id,product_id} 现在,我想要一个product_id的自动增量值,如果店铺id被更改,它将重置为1。基本上,我想要自动生成的复合键 e、 g

店铺ID产品ID

11

1 2

13

2.1

2.2

3.1


我可以用自动增量来实现这一点吗?如何使用?

普通Sqlite表是使用64位整数作为键的B*树。这就是所谓的。插入行时,如果没有为此显式给定值,则会生成一个值。
INTEGER主键
列用作此rowid的别名。
AUTOINCREMENT
关键字只能用于所述的
INTEGER主键
列,与名称相反,它只会改变所述rowid的计算方式-如果您省略一个值,则无论该关键字是否存在,都会创建一个关键字,因为它实际上是rowid,并且必须有一个数字。细节。(rowid值通常是按递增顺序生成的,但不一定是按顺序生成的,顺便说一句,不应将其视为行号或类似的东西)

除了单个
整数
列之外的任何主键都被视为唯一索引,而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;