sql >> Base de Datos >  >> RDS >> SQLite

Autogenerar clave compuesta en SQLite

Las tablas normales de Sqlite son árboles B* que utilizan un número entero de 64 bits como clave. Esto se llama el ID de fila. Al insertar una fila, si no se proporciona explícitamente un valor para esto, se genera uno. Una INTEGER PRIMARY KEY column actúa como un alias para este ID de fila. El AUTOINCREMENT palabra clave, que solo se puede usar en dicha INTEGER PRIMARY KEY columna, contrario al nombre, simplemente altera cómo se calcula dicho ID de fila:si omite un valor, se creará uno, ya sea que esa palabra clave esté presente o no, porque es realmente el ID de fila y debe tener un número. Detalles aquí. (Los valores de fila generalmente se generan en orden creciente, pero no necesariamente secuencial, y no deben tratarse como un número de fila ni nada por el estilo, por cierto).

Cualquier clave principal que no sea un solo INTEGER la columna se trata como un índice único, mientras que el ID de fila sigue siendo la verdadera clave principal (a menos que sea una tabla SIN ROWID), y no se genera automáticamente. Entonces, no, no puedes (fácilmente) hacer lo que quieres.

Probablemente elaboraría un diseño de base de datos en el que tenga una tabla de tiendas, una tabla de productos, cada uno con sus propios identificadores, y una tabla de unión que establezca una relación de muchos a muchos entre los dos. Esto mantiene la identificación del producto igual entre las tiendas, lo que probablemente será menos confuso para las personas; por ejemplo, no esperaría que el mismo artículo tenga un SKU diferente en dos tiendas diferentes de la misma cadena.

Algo como:

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;