sql >> Databasteknik >  >> RDS >> SQLite

Autogenerera sammansatt nyckel i SQLite

Normala SQLite-tabeller är B*-träd som använder ett 64-bitars heltal som nyckel. Detta kallas rowid. Vid infogning av en rad, om ett värde inte uttryckligen anges för detta, genereras ett. En INTEGER PRIMARY KEY kolumnen fungerar som ett alias för denna rad. AUTOINCREMENT nyckelord, som endast kan användas på nämnda INTEGER PRIMARY KEY kolumnen, i motsats till namnet, ändrar bara hur nämnda rowid beräknas - om du utelämnar ett värde kommer ett att skapas oavsett om det nyckelordet finns eller inte, eftersom det verkligen är rowid och måste ha ett nummer. Detaljer här. (Ridvärden genereras i allmänhet i ökande, men inte nödvändigtvis sekventiell, ordning, och bör inte behandlas som ett radnummer eller något liknande, btw).

Vilken primärnyckel som helst förutom en enda INTEGER kolumnen behandlas som ett unikt index, medan rowid förblir den sanna primärnyckeln (såvida det inte är en WITHOUT ROWID-tabell) och genereras inte automatiskt. Så nej, du kan inte (lätt) göra vad du vill.

Jag skulle förmodligen utarbeta en databasdesign där du har en tabell över butiker, en tabell med produkter, var och en med sina egna ID, och en kopplingstabell som upprättar en många-till-många-relation mellan de två. Detta håller produkt-id:t detsamma mellan butiker, vilket förmodligen kommer att vara mindre förvirrande för människor - jag skulle till exempel inte förvänta mig att samma artikel skulle ha olika SKU i två olika butiker i samma kedja.

Något i stil med:

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. ExecuteNonQuery för SELECT SQL-sats som returnerar inga rader

  2. Hur man konverterar från ett datumformat till ett annat i SQL Server med CONVERT()

  3. Vad är databasberoenden?

  4. SQL MIN() för nybörjare