Criei uma tabela no Sqlite usando a CREATE TABLE AS
sintaxe para criar uma tabela com base em uma SELECT
instrução. Agora, esta tabela não tem chave primária, mas gostaria de adicionar uma.
A execução ALTER TABLE table_name ADD PRIMARY KEY(col1, col2,...)
dá um erro de sintaxe "próximo a PRIMARY"
Existe uma maneira de adicionar uma chave primária durante a criação da tabela ou posteriormente no Sqlite?
Por "durante a criação", quero dizer durante a criação com CREATE TABLE AS
.
Respostas:
Você não pode modificar as tabelas SQLite de nenhuma maneira significativa após terem sido criadas. A solução sugerida aceita é criar uma nova tabela com os requisitos corretos, copiar seus dados nela e, em seguida, eliminar a tabela antiga.
aqui está a documentação oficial sobre isso: http://sqlite.org/faq.html#q11
fonte
CREATE UNIQUE INDEX pkName ON tableName(columnName)
) quando estruturas de banco de dados como o SMO do MS SQL realmente fazem você adicionar um PK após a tabela ter sido criada!Enquanto estiver usando
CREATE TABLE
, se estiver criando a chave primária em um único campo , você pode usar:Com
CREATE TABLE
, você também pode sempre usar a seguinte abordagem para criar uma chave primária em um ou vários campos :Referência: http://www.sqlite.org/lang_createtable.html
Esta resposta não aborda a alteração da tabela.
fonte
Tentei adicionar a chave primária posteriormente, alterando a tabela sqlite_master diretamente. Este truque parece funcionar. É uma solução de hack, claro.
Resumindo: crie um índice regular (único) na tabela, torne o esquema gravável e altere o nome do índice para a forma reservada por sqlite para identificar um índice de chave primária, (ou seja, sqlite_autoindex_XXX_1, onde XXX é o nome da tabela) e defina a string sql como NULL. Por fim, altere a própria definição da tabela. Um pittfal: sqlite não vê a mudança do nome do índice até que o banco de dados seja reaberto. Isso parece um bug, mas não é grave (mesmo sem reabrir o banco de dados, você ainda pode usá-lo).
Suponha que a tabela se pareça com:
Então eu fiz o seguinte:
Alguns testes (no shell sqlite):
fonte
De acordo com a documentação do sqlite sobre a criação de tabelas, o uso de create table como select produz uma nova tabela sem restrições e sem chave primária.
No entanto, a documentação também diz que as chaves primárias e os índices exclusivos são logicamente equivalentes ( consulte a seção de restrições ):
Portanto, mesmo que não seja possível alterar a definição da tabela por meio da sintaxe de alteração do SQL, você pode obter o mesmo efeito de chave primária usando um índice exclusivo.
Além disso, qualquer tabela (exceto aquelas criadas sem a sintaxe rowid) tem uma coluna inteira interna conhecida como "rowid". De acordo com os documentos, você pode usar esta coluna interna para recuperar / modificar tabelas de registro.
fonte
Você pode fazer assim:
fonte
Introdução
Ele é baseado em java do Android e é um bom exemplo de como alterar o banco de dados sem incomodar os fãs / clientes de seus aplicativos. Isso é baseado na ideia da página de perguntas frequentes do SQLite http://sqlite.org/faq.html#q11
O problema
Não percebi que preciso definir um row_number ou record_id para excluir um único item comprado em um recibo e, ao mesmo tempo, o número do código de barras do item me enganou ao pensar em torná-lo a chave para excluir aquele item. Estou salvando os detalhes de um recibo na tabela código_de_barras de recebimento. Deixá-lo sem um record_id pode significar a exclusão de todos os registros do mesmo item em um recibo se eu usar o código de barras do item como a chave.
Aviso prévio
Por favor, entenda que este é um copiar e colar do meu código no qual estou trabalhando no momento da redação deste artigo. Use-o apenas como um exemplo, copiar e colar aleatoriamente não o ajudará. Modifique primeiro de acordo com suas necessidades
Além disso, não se esqueça de ler os comentários no código.
O código
Use isso como um método em sua classe para verificar primeiro se a coluna que você deseja adicionar está faltando. Fazemos isso apenas para não repetir o processo de alteração do código_de_barras da tabela. Basta mencioná-lo como parte de sua aula. Na próxima etapa, você verá como o usaremos.
Em seguida, o código a seguir é usado para criar a tabela receive_barcode se ela já NÃO sair para os usuários da primeira vez de seu aplicativo. E observe o "SE NÃO EXISTE" no código. Tem importância.
fonte
Eu tive o mesmo problema e a melhor solução que encontrei é primeiro criar a tabela que define a chave primária e então usar a instrução insert into.
fonte
Usei a sintaxe CREATE TABLE AS para mesclar várias colunas e encontrei o mesmo problema. Aqui está um AppleScript que escrevi para acelerar o processo.
fonte
Acho que adicionar um índice nessa coluna pode ter praticamente o mesmo efeito.
fonte
fonte
Use uma ferramenta como o DB Browser para SQLite, permite adicionar PK, AI simplesmente clicando com o botão direito na tabela -> modificar.
fonte