SQLite
 sql >> Database >  >> RDS >> SQLite

Genera automaticamente la chiave composita in SQLite

Le normali tabelle Sqlite sono alberi B* che utilizzano un intero a 64 bit come chiave. Questo è chiamato il rowid. Quando si inserisce una riga, se un valore non viene fornito in modo esplicito per questo, ne viene generato uno. Una INTEGER PRIMARY KEY colonna funge da alias per questo rowid. Il AUTOINCREMENT parola chiave, che può essere utilizzata solo su detta INTEGER PRIMARY KEY la colonna, contrariamente al nome, altera semplicemente il modo in cui viene calcolato il rowid - se si omette un valore, ne verrà creato uno indipendentemente dal fatto che quella parola chiave sia presente o meno, perché è davvero il rowid e deve avere un numero. Dettagli qui. (i valori rowid sono generalmente generati in ordine crescente, ma non necessariamente sequenziale, e non dovrebbero essere trattati come un numero di riga o qualcosa del genere, tra l'altro).

Qualsiasi chiave primaria diversa da un singolo INTEGER colonna viene trattata come un indice univoco, mentre rowid rimane la vera chiave primaria (a meno che non sia una tabella WITHOUT ROWID) e non viene generata automaticamente. Quindi no, non puoi (facilmente) fare quello che vuoi.

Probabilmente elaborerei un progetto di database in cui hai una tabella di negozi, una tabella di prodotti, ciascuno con i propri ID e una tabella di giunzione che stabilisce una relazione molti-a-molti tra i due. Ciò mantiene l'ID prodotto lo stesso tra i negozi, il che probabilmente creerà meno confusione per le persone:non mi aspetto che lo stesso articolo abbia una SKU diversa in due negozi diversi della stessa catena, ad esempio.

Qualcosa come:

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;