Eu precisaria renomear algumas colunas em algumas tabelas em um banco de dados SQLite. Eu sei que uma pergunta semelhante foi feita anteriormente no stackoverflow, mas era para o SQL em geral, e o caso do SQLite não foi mencionado.
A partir da documentação do SQLite para ALTER TABLE , entendo que não é possível fazer isso "facilmente" (isto é, uma única instrução ALTER TABLE).
Eu queria saber se alguém sabia de uma maneira SQL genérica de fazer uma coisa dessas com o SQLite.
sqlite
alter-table
joce
fonte
fonte
Respostas:
Isso foi corrigido apenas com 15/09/2018 (3.25.0)
Você pode encontrar a nova sintaxe documentada em
ALTER TABLE
Fonte da imagem: https://www.sqlite.org/images/syntax/alter-table-stmt.gif
Exemplo:
demonstração do db-fiddle.com
Suporte Android
Até o momento, a API 27 do Android está usando o pacote SQLite versão 3.19 .
Com base na versão atual que o Android está usando e que esta atualização está chegando na versão 3.25.0 do SQLite, eu diria que você tem um pouco de espera (aproximadamente API 33) antes que o suporte para isso seja adicionado ao Android.
E, mesmo assim, se você precisar oferecer suporte a versões anteriores à API 33, não poderá usá-lo.
fonte
database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")
. COLUM está destacado em vermelho e diz TO esperado, obteve 'COLUMN' . Infelizmente, o Android ainda está na versão 3.19 do SQLite, e é por isso que isso não funciona para mim.Digamos que você tenha uma tabela e precise renomear "colb" para "col_b":
Primeiro você renomeia a tabela antiga:
Em seguida, crie a nova tabela, com base na tabela antiga, mas com o nome da coluna atualizada:
Em seguida, copie o conteúdo da tabela original.
Por fim, largue a mesa antiga.
Envolvendo tudo isso em um
BEGIN TRANSACTION;
eCOMMIT;
também é provavelmente uma boa idéia.fonte
.schema
comando do SQLite é útil para mostrar aCREATE TABLE
instrução que compõe a tabela existente. Você pode obter sua saída, modificar conforme necessário e executá-la para criar a nova tabela. Este comando também mostra osCREATE INDEX
comandos necessários para criar os índices, que devem cobrir as preocupações de Thomas. Obviamente, certifique-se de executar este comando antes de alterar qualquer coisa.Pesquisando, encontrei essa ferramenta gráfica multiplataforma (Linux | Mac | Windows) chamada DB Browser for SQLite, que na verdade permite renomear colunas de uma maneira muito amigável!
Editar | Tabela de modificação | Selecionar tabela | Editar campo. Clique clique! Voila!
No entanto, se alguém quiser compartilhar uma maneira programática de fazer isso, ficarei feliz em saber!
fonte
Embora seja verdade que não haja ALTER COLUMN, se você deseja renomear a coluna, solte a restrição NOT NULL ou altere o tipo de dados, use o seguinte conjunto de comandos:
Nota: Esses comandos podem corromper seu banco de dados, portanto, verifique se você possui um backup
Você precisará fechar e reabrir sua conexão ou aspirar o banco de dados para recarregar as alterações no esquema.
Por exemplo:
AS REFERÊNCIAS SEGUEM:
pragma writable_schema
Quando esse pragma está ativado, as tabelas SQLITE_MASTER no qual o banco de dados pode ser alterado usando as instruções UPDATE, INSERT e DELETE comuns. Aviso: o uso incorreto deste pragma pode resultar facilmente em um arquivo de banco de dados corrompido.
alterar tabela O
SQLite suporta um subconjunto limitado de ALTER TABLE. O comando ALTER TABLE no SQLite permite que o usuário renomeie uma tabela ou adicione uma nova coluna a uma tabela existente. Não é possível renomear uma coluna, remover uma coluna ou adicionar ou remover restrições de uma tabela.
fonte
Recentemente, tive que fazer isso no SQLite3 com uma tabela chamada points com as colunas id, lon, lat . Erradamente, quando a tabela foi importada, os valores de latitude foram armazenados na coluna lon e vice-versa; portanto, uma correção óbvia seria renomear essas colunas. Então o truque foi:
Espero que isso seja útil para você!
fonte
Citando a documentação do sqlite :
Obviamente, o que você pode fazer é criar uma nova tabela com o novo layout
SELECT * FROM old_table
e preencher a nova tabela com os valores que você receberá.fonte
Primeiro, é uma daquelas coisas que me surpreendem: renomear uma coluna requer a criação de uma tabela totalmente nova e a cópia dos dados da tabela antiga para a nova tabela ...
A GUI em que aterrei para executar operações SQLite é Base . Tem uma janela de log bacana que mostra todos os comandos que foram executados. A renomeação de uma coluna via Base preenche a janela de log com os comandos necessários:
Estes podem ser facilmente copiados e colados onde você precisar. Para mim, isso está em um arquivo de migração do ActiveAndroid . Um toque interessante também é que os dados copiados incluem apenas os comandos SQLite, não os registros de data e hora, etc.
Felizmente, isso economiza tempo para algumas pessoas.
fonte
BEGIN TRANSACTION;
eCOMMIT;
, pois o ActiveAndroid lida com isso sozinho.CASO 1: SQLite 3.25.0+
Somente a versão 3.25.0 do SQLite suporta renomear colunas. Se o seu dispositivo está atendendo a esse requisito, as coisas são bem simples. A consulta abaixo resolveria seu problema:
CASO 2: versões anteriores do SQLite
Você precisa seguir uma abordagem diferente para obter o resultado que pode ser um pouco complicado
Por exemplo, se você tiver uma tabela como esta:
E se você deseja alterar o nome da coluna
Location
Etapa 1: renomeie a tabela original:
Etapa 2: agora crie uma nova tabela
student
com o nome correto da coluna:Etapa 3: Copie os dados da tabela original para a nova tabela:
Nota: O comando acima deve ser todo uma linha.
Etapa 4: Solte a tabela original:
Com essas quatro etapas, você pode alterar manualmente qualquer tabela SQLite. Lembre-se de que você também precisará recriar quaisquer índices, visualizadores ou gatilhos na nova tabela.
fonte
alterar coluna da tabela <id> para <_id>
fonte
Crie uma nova coluna com o nome da coluna desejada: COLNew.
Copie o conteúdo da coluna antiga COLOld para a nova coluna COLNew.
Nota: colchetes são necessários na linha acima.
fonte
Como mencionado anteriormente, existe uma ferramenta SQLite Database Browser, que faz isso. Lentamente, essa ferramenta mantém um registro de todas as operações executadas pelo usuário ou pelo aplicativo. Fazendo isso uma vez e olhando para o log do aplicativo, você verá o código envolvido. Copie a consulta e cole conforme necessário. Trabalhou para mim. Espero que isto ajude
fonte
A partir da documentação oficial
Opcionalmente, um procedimento mais simples e rápido pode ser usado para algumas alterações que não afetam o conteúdo do disco de forma alguma. O procedimento mais simples a seguir é apropriado para remover as restrições CHECK ou FOREIGN KEY ou NOT NULL, renomear colunas ou adicionar ou remover ou alterar valores padrão em uma coluna.
Inicie uma transação.
Execute PRAGMA schema_version para determinar o número da versão atual do esquema. Esse número será necessário para a etapa 6 abaixo.
Ative a edição do esquema usando PRAGMA writable_schema = ON.
Execute uma instrução UPDATE para alterar a definição da tabela X na tabela sqlite_master: UPDATE sqlite_master SET sql = ... WHERE type = 'table' AND name = 'X';
Cuidado: Fazer uma alteração na tabela sqlite_master como esta tornará o banco de dados corrompido e ilegível se a alteração contiver um erro de sintaxe. Sugere-se que um teste cuidadoso da instrução UPDATE seja feito em um banco de dados em branco separado antes de usá-lo em um banco de dados contendo dados importantes.
Se a alteração na tabela X também afetar outras tabelas ou índices ou gatilhos são visualizações no esquema, execute as instruções UPDATE para modificar também esses outros índices e tabelas de tabelas. Por exemplo, se o nome de uma coluna mudar, todas as restrições, gatilhos, índices e visualizações FOREIGN KEY que se referem a essa coluna deverão ser modificados.
Cuidado: Mais uma vez, fazer alterações na tabela sqlite_master como esta tornará o banco de dados corrompido e ilegível se a alteração contiver um erro. Teste com cuidado todo esse procedimento em um banco de dados de teste separado antes de usá-lo em um banco de dados contendo dados importantes e / ou faça cópias de backup de bancos de dados importantes antes de executar este procedimento.
Incremente o número da versão do esquema usando PRAGMA schema_version = X em que X é um a mais que o número da versão do esquema antigo encontrado na etapa 2 acima.
Desative a edição de esquema usando PRAGMA writable_schema = OFF.
(Opcional) Execute PRAGMA truth_check para verificar se as alterações no esquema não danificaram o banco de dados.
Confirme a transação iniciada na etapa 1 acima.
fonte
Uma opção, se você precisar fazer isso rapidamente e se sua coluna inicial foi criada com o padrão, é criar a nova coluna desejada, copiar o conteúdo para ela e basicamente "abandonar" a coluna antiga (ela permanece presente, mas você simplesmente não o usa / atualiza, etc.)
ex:
Isso deixa para trás uma coluna (e se ela foi criada com NOT NULL, mas sem um padrão, as inserções futuras que a ignoram podem falhar), mas se for apenas uma tabela descartável, as compensações podem ser aceitáveis. Caso contrário, use uma das outras respostas mencionadas aqui ou um banco de dados diferente que permita que as colunas sejam renomeadas.
fonte
Desde a versão 2018-09-15 (3.25.0), o sqlite suporta renomear colunas
https://sqlite.org/changes.html
fonte
sqlite3 yourdb .dump> /tmp/db.txt
edite /tmp/db.txt altere o nome da coluna na linha Criar
sqlite2 yourdb2 </tmp/db.txt
mv / mova yourdb2 yourdb
fonte