Normální Sqlite tabulky jsou B*-stromy, které používají jako klíč 64bitové celé číslo. Tomu se říká rowid. Pokud při vkládání řádku není explicitně zadána hodnota, vygeneruje se jedna. INTEGER PRIMARY KEY
slouží jako alias pro tento rowid. AUTOINCREMENT
klíčové slovo, které lze použít pouze pro uvedený INTEGER PRIMARY KEY
sloupec, na rozdíl od názvu, pouze mění způsob výpočtu uvedeného rowid - pokud vynecháte hodnotu, bude vytvořena jedna, ať už je toto klíčové slovo přítomno nebo ne, protože je to skutečně rowid a musí mít číslo. Podrobnosti zde. (hodnoty rowid jsou obecně generovány v rostoucím, ale ne nutně sekvenčním pořadí, a nemělo by se s nimi zacházet jako s číslem řádku nebo podobně, btw).
Jakýkoli primární klíč jiný než jeden INTEGER
sloupec je považován za jedinečný index, zatímco rowid zůstává skutečným primárním klíčem (Pokud se nejedná o tabulku BEZ ROWID) a není automaticky generován. Takže ne, nemůžete (snadno) dělat, co chcete.
Pravděpodobně bych vypracoval návrh databáze, kde byste měli tabulku obchodů, tabulku produktů, z nichž každý má své vlastní ID, a spojovací tabulku, která mezi nimi vytváří vztah mnoho k mnoha. Díky tomu zůstane ID produktu mezi obchody stejné, což bude pro lidi pravděpodobně méně matoucí – neočekával bych, že stejná položka bude mít různé SKU například ve dvou různých obchodech stejného řetězce.
Něco jako:
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;