Pergunta

eu precisaria mudar o nome de algumas colunas em algumas tabelas em um banco de dados SQLite. Eu sei que um pergunta semelhante tem sido solicitado em stackoverflow anteriormente, mas foi para o SQL em geral, e no caso de SQLite não foi mencionado.

A partir da documentação SQLite para ALTER TABLE , suponho que não é possível fazer tal coisa "facilmente" (ou seja, uma única instrução ALTER TABLE).

Eu estava imaginando alguém sabia de uma maneira SQL genérico de fazer uma coisa dessas com SQLite.

Foi útil?

Solução

Este foi apenas corrigido com 2018/09/15 (3.25.0)

Melhorias o comando ALTER TABLE:

  • Adicionar suporte para renomear colunas dentro de uma tabela utilizando ALTER TABLE mesa RENAME COLUMN oldname TO newname.
  • Fix recurso de tabela de mudança de nome para que ele também atualiza as referências à tabela renomeada em gatilhos e pontos de vista.

Você pode encontrar a nova sintaxe documentada sob ALTER TABLE

A sintaxe RENAME COLUMN TO muda o nome da coluna da tabela table-name em um novo-nome-coluna. O nome da coluna é alterada tanto dentro da definição da tabela si e também em todos os índices, gatilhos, e vistas que fazem referência a coluna. Se a mudança de nome da coluna resultaria em uma ambigüidade semântica em um gatilho ou exibição, em seguida, o RENAME COLUMN falha com um erro e nenhuma alteração será aplicada.

 enter descrição da imagem aqui Fonte da imagem: https://www.sqlite.org/images /syntax/alter-table-stmt.gif

Exemplo:

CREATE TABLE tab AS VALUES(1);

SELECT * FROM tab;

ALTER TABLE tab RENAME TO tab_new;

SELECT * FROM tab_new;

db-fiddle.com demonstração


Android Suporte

Como na escrita, do Android API 27 está usando 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 pouco de esperar (cerca de API 33) antes de apoio a este é adicionado ao Android.

E, mesmo assim, se você precisa para apoiar as versões mais antigas do que a API 33, você não será capaz de usar este.

Outras dicas

Digamos que você tenha uma mesa e necessidade de mudar o nome de "colb" para "col_b":

Primeiro você renomear a tabela antiga:

ALTER TABLE orig_table_name RENAME TO tmp_table_name;

Em seguida, crie a nova tabela, com base na tabela antiga, mas com o nome da coluna actualização:

CREATE TABLE orig_table_name (
  col_a INT
, col_b INT
);

Em seguida, copie o conteúdo do outro lado da tabela original.

INSERT INTO orig_table_name(col_a, col_b)
SELECT col_a, colb
FROM tmp_table_name;

Por fim, solte a tabela antiga.

DROP TABLE tmp_table_name;

Embalagem tudo isso em um BEGIN TRANSACTION; e COMMIT; também é provavelmente uma boa idéia.

Embora seja verdade que não há COLUMN ALTER, se você só quer mudar o nome da coluna, gota a restrição NOT NULL, ou alterar o tipo de dados, você pode usar o seguinte conjunto de comandos:

Nota: Estes comandos têm o potencial para corromper seu banco de dados, por isso verifique se você tem um backup

PRAGMA writable_schema = 1;
UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';
PRAGMA writable_schema = 0;

Você terá que quer fechar e reabrir sua conexão ou aspirar o banco de dados para recarregar as mudanças no esquema.

Por exemplo:

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> create table BOOKS ( title TEXT NOT NULL, publication_date TEXT NOT NULL);  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
Error: BOOKS.publication_date may not be NULL  
sqlite> PRAGMA writable_schema = 1; 
sqlite> UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT NOT NULL, publication_date TEXT)' WHERE NAME = 'BOOKS';  
sqlite> PRAGMA writable_schema = 0;  
sqlite> .q  

Y:\> sqlite3 booktest  
SQLite version 3.7.4  
Enter ".help" for instructions  
Enter SQL statements terminated with a ";"  
sqlite> insert into BOOKS VALUES ("NULLTEST",null);  
sqlite> .q  

Referências seguir:


pragma writable_schema
Quando isso pragma está ligado, as tabelas sqlite_master em qual banco de dados pode ser alterado usando ATUALIZAÇÃO comum, INSERT, e instruções DELETE. Aviso:. Uso indevido deste pragma pode facilmente resultar em um arquivo de banco de dados corrompido

ALTER TABLE
SQLite suporta um subconjunto limitado de ALTER TABLE. O comando ALTER TABLE em SQLite permite ao usuário mudar o nome de uma tabela ou para adicionar 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.

ALTER TABLE Syntax

cavando ao redor, eu encontrei este multiplataforma (Linux | Mac | Windows) ferramenta gráfica chamada DB navegador para SQLite que realmente permite um para renomear colunas de uma forma muito amigável!

Editar | Modificar Tabela | Selecione Tabela | Editar campo. Clique clique! Voila!

No entanto, se alguém quiser compartilhar uma maneira programática de fazer isso, eu ficaria feliz em saber!

Recentemente eu tive que fazer isso em SQLite3 com uma tabela chamada pontos com as colunms id, lon, lat . Erroneusly, quando a tabela foi importada, os valores de latitude onde armazenados na lon coluna e vice-versa, então uma correção óbvia seria a de renomear as colunas. Portanto, o truque foi:

create table points_tmp as select id, lon as lat, lat as lon from points;
drop table points;
alter table points_tmp rename to points;

Espero que isso seria útil para você!

sqlite documentação :

SQLite suporta um subconjunto limitado de ALTERAR A TABELA. O comando ALTER TABLE em SQLite permite ao usuário renomear um mesa ou para adicionar uma nova coluna a uma tabela existente. Não é possível renomear um colum, remover uma coluna, ou adicionar ou remover restrições de uma tabela.

O que você pode fazer, claro, é, criar uma nova tabela com o novo layout, SELECT * FROM old_table, e preencher a nova tabela com os valores que você receberá.

Em primeiro lugar, esta é uma daquelas coisas que bofetadas-me no rosto com surpresa: renomeação de uma coluna requer a criação de uma tabela totalmente novo e copiar os dados da tabela antiga para a nova tabela ...

A GUI eu pousou em fazer operações SQLite é Base de . Ele tem uma janela Log bacana que mostra todos os comandos que foram executados. Fazendo uma mudança de nome de uma coluna via Base de Dados preenche a janela de log com os comandos necessários:

Janela log Base

Estes podem então ser facilmente copiado e colado onde você pode precisar deles. Para mim, isso é em um href="https://github.com/pardom/ActiveAndroid" rel="noreferrer"> ActiveAndroid migração de arquivos

Com sorte, que salva algumas pessoas tempo.

coluna mudança tabela para <_id>

 String LastId = "id";

    database.execSQL("ALTER TABLE " + PhraseContract.TABLE_NAME + " RENAME TO " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("CREATE TABLE " + PhraseContract.TABLE_NAME
    +"("
            + PhraseContract.COLUMN_ID + " INTEGER PRIMARY KEY,"
            + PhraseContract.COLUMN_PHRASE + " text ,"
            + PhraseContract.COLUMN_ORDER  + " text ,"
            + PhraseContract.COLUMN_FROM_A_LANG + " text"
    +")"
    );
    database.execSQL("INSERT INTO " +
            PhraseContract.TABLE_NAME + "("+ PhraseContract.COLUMN_ID +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +")" +
            " SELECT " + LastId +" , "+ PhraseContract.COLUMN_PHRASE + " , "+ PhraseContract.COLUMN_ORDER +" , "+ PhraseContract.COLUMN_FROM_A_LANG +
            " FROM " + PhraseContract.TABLE_NAME + "old");
    database.execSQL("DROP TABLE " + PhraseContract.TABLE_NAME + "old");

Como mencionado anteriormente, há uma ferramenta SQLite Database Browser, que faz isso. Lyckily, esta ferramenta mantém um registro de todas as operações realizadas pelo usuário ou o aplicativo. Fazer isso uma vez e olhando para o log do aplicativo, você verá o código envolvido. Copie a consulta e cole como necessário. Trabalhou para mim. Espero que isso ajude

Criar uma nova coluna com o nome da coluna desejada: COLNOVO.

ALTER TABLE {tableName} ADD COLUMN COLNew {type};

Copiar conteúdo da coluna de idade COLOld a nova coluna COLNOVO.

INSERT INTO {tableName} (COLNew) SELECT {COLOld} FROM {tableName}

Nota: entre parênteses são necessárias linha acima.

A partir da documentação oficial

Um procedimento mais simples e mais rápido pode, opcionalmente, ser utilizado para algumas mudanças que não afetam o conteúdo no disco de qualquer forma. O seguinte procedimento mais simples é apropriado para a remoção de cheque ou FOREIGN KEY ou NOT restrições NULL, colunas renomear , ou adicionando ou removendo ou alterando os valores padrão em uma coluna.

  1. Iniciar uma transação.

  2. schema_version Run PRAGMA para determinar o número de versão do esquema atual. Este número será necessário para a etapa 6 abaixo.

  3. Activar esquema edição usando PRAGMA writable_schema = ON.

  4. Executar uma instrução UPDATE para alterar a definição da tabela X na tabela de sqlite_master: UPDATE sqlite_master SET sql = ... WHERE tipo = 'tabela' E name = 'X';

    Atenção: Fazendo uma alteração à tabela de sqlite_master como este irá processar o banco de dados corrompido e ilegível se a mudança contém um erro de sintaxe. Sugere-se que o teste de cuidado da instrução UPDATE ser feito em uma base de dados vazia separado antes de usá-lo em um banco de dados contendo dados importantes.

  5. Se a alteração à tabela X também afeta outras tabelas ou índices ou gatilhos são vistas dentro do esquema, instruções UPDATE depois correr para modificar esses outros índices tabelas e exibições também. Por exemplo, se o nome de um alterações de coluna, todos os FOREIGN KEY restrições, triggers, índices e vistas que se referem a essa coluna deve ser modificado.

    Atenção: Mais uma vez, fazer mudanças para a tabela de sqlite_master como este irá processar o banco de dados corrompido e ilegível se a mudança contém um erro. Cuidadosamente teste de todo este procedimento em um banco de dados de teste separado antes de usá-lo em um banco de dados contendo dados importantes e / ou fazer cópias de segurança de bases de dados importantes antes de executar este procedimento.

  6. incrementar o número de versão do esquema usando PRAGMA schema_version = X, onde X é um mais do que o número de versão do esquema de idade encontrada na etapa 2 acima.

  7. esquema desativar a edição usando PRAGMA writable_schema = OFF.

  8. (Opcional) Executar PRAGMA integrity_check para verificar se as alterações de esquema não danificar o banco de dados.

  9. Confirmar a transação começou no passo 1 acima.

Uma opção, se você precisar dele feito em um beliscão, e se sua coluna inicial foi criado com um padrão, é criar a nova coluna que deseja, copie o conteúdo sobre a ele, e, basicamente, "abandonar" a coluna de idade (ele permanece presente, mas você apenas não use / atualizá-lo, etc.)

ex:

alter table TABLE_NAME ADD COLUMN new_column_name TYPE NOT NULL DEFAULT '';
update TABLE_NAME set new_column_name = old_column_name;
update TABLE_NAME set old_column_name = ''; -- abandon old column, basically

Isso deixa atrás de uma coluna (e se ele foi criado com NOT NULL, mas sem um padrão, então futuras inserções que ignoram isso pode falhar), mas se é apenas uma mesa descartável, as compensações pode ser aceitável. Caso contrário, use uma das outras respostas mencionado aqui, ou outro banco de dados que permite colunas a ser renomeado.

CASE 1: SQLite 3.25.0 +

Apenas a versão 3.25.0 do SQLite suporta renomear colunas. Se o dispositivo está a cumprir este requisito, as coisas são muito simples. A consulta a seguir iria resolver o seu problema:

ALTER TABLE "MyTable" RENAME COLUMN "OldColumn" TO "NewColumn";

CASE 2: Versões SQLite mais velhos

Você tem que seguir uma abordagem diferente para obter o resultado que pode ser um pouco complicado

Por exemplo, se você tem uma tabela como esta:

CREATE TABLE student(Name TEXT, Department TEXT, Location TEXT)

E se você quiser mudar o nome do Location coluna

Passo 1: Mudar o nome da tabela original:

ALTER TABLE student RENAME TO student_temp;

Passo 2: Agora crie uma nova student mesa com nome de coluna correta:

CREATE TABLE student(Name TEXT, Department TEXT, Address TEXT)

Passo 3: Copiar os dados da tabela original para a nova tabela:

INSERT INTO student(Name, Department, Address) SELECT Name, Department, Location FROM student_temp;

Nota:. O comando acima deve ser tudo uma linha

Passo 4: Gota da tabela original:

DROP TABLE student_temp;

Com estas quatro etapas você pode alterar manualmente qualquer tabela SQLite. Tenha em mente que você também terá de recriar qualquer índices, telespectadores ou gatilhos sobre a nova tabela também.

Desde a versão 2018/09/15 (3.25.0) suportes SQLite renomeando colunas

https://sqlite.org/changes.html

sqlite3 yourdb .dump> /tmp/db.txt
editar /tmp/db.txt nome da coluna mudança na Criar linha
sqlite2 yourdb2 mv / move yourdb2 yourdb

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top