sql >> Database >  >> RDS >> SQLite

Samengestelde sleutel automatisch genereren in SQLite

Normale Sqlite-tabellen zijn B*-trees die een 64-bits geheel getal als hun sleutel gebruiken. Dit wordt de rowid genoemd. Als er bij het invoegen van een rij niet expliciet een waarde is opgegeven, wordt er een gegenereerd. Een INTEGER PRIMARY KEY kolom fungeert als een alias voor deze rowid. De AUTOINCREMENT trefwoord, dat alleen kan worden gebruikt op de INTEGER PRIMARY KEY kolom, in tegenstelling tot de naam, verandert alleen de manier waarop de rowid wordt berekend - als u een waarde weglaat, wordt er een gemaakt, ongeacht of dat trefwoord aanwezig is of niet, omdat het echt de rowid is en een nummer moet hebben. Details hier. (rowid-waarden worden over het algemeen gegenereerd in toenemende, maar niet noodzakelijk sequentiële volgorde, en mogen trouwens niet worden behandeld als een rijnummer of iets dergelijks).

Elke andere primaire sleutel dan een enkele INTEGER kolom wordt behandeld als een unieke index, terwijl de rowid de echte primaire sleutel blijft (tenzij het een ZONDER ROWID-tabel is) en niet automatisch wordt gegenereerd. Dus nee, je kunt niet (gemakkelijk) doen wat je wilt.

Ik zou waarschijnlijk een database-ontwerp uitwerken waarin je een tabel met winkels hebt, een tabel met producten, elk met hun eigen id's, en een verbindingstabel die een veel-op-veel-relatie tussen de twee tot stand brengt. Hierdoor blijft de product-ID hetzelfde tussen winkels, wat waarschijnlijk minder verwarrend zal zijn voor mensen - ik zou bijvoorbeeld niet verwachten dat hetzelfde artikel een andere SKU heeft in twee verschillende winkels van dezelfde keten.

Iets als:

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 Server 2012 opvragen van Access 2007-gegevens met behulp van OPENROWSET-fout

  2. Hoe krijg ik een kolom met opeenvolgende, oplopende nummers, zonder dat er nummers ontbreken?

  3. JDBC ResultSet getDate verliest precisie

  4. LOAD DATA INFILE equivalent in Oracle