SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Gerar chave composta automaticamente no SQLite


Tabelas SQLite normais são árvores B* que usam um inteiro de 64 bits como chave. Isso é chamado de rowid. Ao inserir uma linha, se um valor não for fornecido explicitamente para isso, um será gerado. Uma INTEGER PRIMARY KEY column atua como um alias para este rowid. O AUTOINCREMENT palavra-chave, que só pode ser usada na referida INTEGER PRIMARY KEY column, ao contrário do nome, apenas altera a forma como o rowid é calculado - se você deixar de fora um valor, será criado um valor se essa palavra-chave estiver presente ou não, porque é realmente o rowid e deve ter um número. Detalhes aqui. (valores de rowid geralmente são gerados em ordem crescente, mas não necessariamente sequencial, e não devem ser tratados como um número de linha ou algo assim, btw).

Qualquer chave primária diferente de um único INTEGER column é tratado como um índice exclusivo, enquanto o rowid permanece a verdadeira chave primária (a menos que seja uma tabela WITHOUT ROWID) e não é gerada automaticamente. Então, não, você não pode (facilmente) fazer o que quer.

Eu provavelmente trabalharia em um projeto de banco de dados onde você tem uma tabela de lojas, uma tabela de produtos, cada uma com seus próprios ids, e uma tabela de junção que estabelece uma relação muitos-para-muitos entre os dois. Isso mantém o ID do produto igual entre as lojas, o que provavelmente será menos confuso para as pessoas - eu não esperaria que o mesmo item tivesse um SKU diferente em duas lojas diferentes da mesma rede, por exemplo.

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;