SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Zusammengesetzten Schlüssel in SQLite automatisch generieren

Normale Sqlite-Tabellen sind B*-Bäume, die eine 64-Bit-Ganzzahl als Schlüssel verwenden. Dies wird als Rowid bezeichnet. Wenn beim Einfügen einer Zeile nicht explizit ein Wert dafür angegeben wird, wird einer generiert. Ein INTEGER PRIMARY KEY Spalte fungiert als Alias ​​für diese Zeilen-ID. Das AUTOINCREMENT Schlüsselwort, das nur für diesen INTEGER PRIMARY KEY verwendet werden kann Spalte ändert im Gegensatz zum Namen lediglich, wie die Rowid berechnet wird - wenn Sie einen Wert weglassen, wird einer erstellt, unabhängig davon, ob dieses Schlüsselwort vorhanden ist oder nicht, da es sich wirklich um die Rowid handelt und eine Zahl haben muss. Details hier. (Rowid-Werte werden im Allgemeinen in aufsteigender, aber nicht unbedingt sequenzieller Reihenfolge generiert und sollten übrigens nicht wie eine Zeilennummer oder ähnliches behandelt werden).

Jeder andere Primärschlüssel als ein einzelner INTEGER -Spalte wird als eindeutiger Index behandelt, während die Zeilen-ID der wahre Primärschlüssel bleibt (sofern es sich nicht um eine OHNE ROWID-Tabelle handelt) und nicht automatisch generiert wird. Also, nein, Sie können nicht (einfach) tun, was Sie wollen.

Ich würde wahrscheinlich ein Datenbankdesign ausarbeiten, bei dem Sie eine Tabelle mit Geschäften, eine Tabelle mit Produkten mit jeweils eigenen IDs und eine Verbindungstabelle haben, die eine Viele-zu-Viele-Beziehung zwischen den beiden herstellt. Dadurch bleibt die Produkt-ID zwischen den Geschäften gleich, was für die Leute wahrscheinlich weniger verwirrend sein wird - ich würde zum Beispiel nicht erwarten, dass derselbe Artikel in zwei verschiedenen Geschäften derselben Kette eine andere SKU hat.

Etwas wie:

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;