SQLite
 sql >> Base de données >  >> RDS >> SQLite

Générer automatiquement une clé composite dans SQLite

Les tables Sqlite normales sont des arbres B* qui utilisent un entier 64 bits comme clé. C'est ce qu'on appelle le rowid. Lors de l'insertion d'une ligne, si une valeur n'est pas explicitement donnée pour cela, une valeur est générée. Une INTEGER PRIMARY KEY colonne agit comme un alias pour ce rowid. L'AUTOINCREMENT mot-clé, qui ne peut être utilisé que sur ladite INTEGER PRIMARY KEY la colonne, contrairement au nom, modifie simplement la façon dont ledit rowid est calculé - si vous omettez une valeur, une sera créée, que ce mot-clé soit présent ou non, car c'est vraiment le rowid et doit avoir un nombre. Détails ici. (les valeurs rowid sont généralement générées dans un ordre croissant, mais pas nécessairement séquentiel, et ne doivent pas être traitées comme un numéro de ligne ou quelque chose comme ça, btw).

Toute clé primaire autre qu'un seul INTEGER La colonne est traitée comme un index unique, tandis que le rowid reste la véritable clé primaire (sauf s'il s'agit d'une table SANS ROWID) et n'est pas généré automatiquement. Donc, non, vous ne pouvez pas (facilement) faire ce que vous voulez.

Je travaillerais probablement sur une conception de base de données où vous avez une table de magasins, une table de produits, chacun avec ses propres identifiants, et une table de jonction qui établit une relation plusieurs à plusieurs entre les deux. Cela permet de conserver le même identifiant de produit entre les magasins, ce qui sera probablement moins déroutant pour les gens - je ne m'attendrais pas à ce que le même article ait un SKU différent dans deux magasins différents de la même chaîne, par exemple.

Quelque chose comme :

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;