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

Autogenerer sammensat nøgle i SQLite

Normale Sqlite-tabeller er B*-træer, der bruger et 64-bit heltal som deres nøgle. Dette kaldes rowid. Ved indsættelse af en række, hvis en værdi ikke er angivet eksplicit for denne, genereres en. En INTEGER PRIMARY KEY kolonne fungerer som et alias for denne række. AUTOINCREMENT nøgleord, som kun kan bruges på nævnte INTEGER PRIMARY KEY kolonne, i modsætning til navnet, ændrer blot, hvordan nævnte rowid beregnes - hvis du udelader en værdi, vil der blive oprettet en, uanset om det søgeord er til stede eller ej, fordi det virkelig er rowidet og skal have et tal. Detaljer her. (Rækkeværdier genereres generelt i stigende, men ikke nødvendigvis sekventielle, rækkefølge, og bør ikke behandles som et rækkenummer eller noget lignende, btw).

Enhver primær nøgle ud over en enkelt INTEGER kolonnen behandles som et unikt indeks, mens rowiden forbliver den sande primære nøgle (medmindre det er en WITHOUT ROWID-tabel), og er ikke autogenereret. Så nej, du kan ikke (let) gøre, hvad du vil.

Jeg ville nok udarbejde et databasedesign, hvor du har en tabel over butikker, en tabel med produkter, hver med deres egne id'er, og en junction-tabel, der etablerer en mange-til-mange-relation mellem de to. Dette holder produkt-id'et det samme mellem butikker, hvilket sandsynligvis vil være mindre forvirrende for folk - jeg ville for eksempel ikke forvente, at den samme vare har en anden SKU i to forskellige butikker i samme kæde.

Noget som:

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;



  1. SQL Client til Mac OS X, der fungerer med MS SQL Server

  2. Hvad er nyt i MariaDB Cluster 10.4

  3. Sådan aktiveres en CHECK-begrænsning i SQL Server (T-SQL-eksempel)

  4. Behov for at konvertere Oracle Merge til forespørgsel til PostgreSQL