Quero excluir ou adicionar coluna no banco de dados sqlite
Estou usando a consulta a seguir para excluir a coluna.
ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME
Mas dá erro
System.Data.SQLite.SQLiteException: SQLite error
near "DROP": syntax error
Respostas:
ALTER TABLE SQLite
Você pode:
fonte
PRAGMA foreign_keys=OFF
. Nesse caso, após fazer essa sequência, é preciso chamarPRAGMA foreign_keys=ON
para reativar as chaves estrangeiras.RENAME COLUMN
é suportado. 🎉 sqlite.org/releaselog/3_25_0.htmlEu escrevi uma implementação Java com base na maneira recomendada pelo Sqlite de fazer isso:
Para obter a coluna da tabela, usei o "PRAGMA table_info":
Na verdade, eu escrevi sobre isso no meu blog, você pode ver mais explicações aqui:
http://udinic.wordpress.com/2012/05/09/sqlite-drop-column-support/
fonte
INSERT
declaração, você também pode criar a nova tabela fazendo um #"CREAT TABLE" + tableName + "AS SELECT " + columnsSeperated + " FROM " + tableName + "_old;"
Como outros apontaram
fonte: http://www.sqlite.org/lang_altertable.html
Enquanto você sempre pode criar uma nova tabela e soltar a mais antiga. Vou tentar explicar esta solução alternativa com um exemplo.
Agora você deseja remover a coluna
height
desta tabela.Crie outra tabela chamada
new_person
Agora copie os dados da tabela antiga
Agora solte a
person
tabela e renomeienew_person
paraperson
Então agora, se você fizer um
.schema
, veráfonte
CREATE TABLE new_person AS SELECT id, first_name, last_name, age FROM person;
http://www.sqlite.org/lang_altertable.html
Como você pode ver no diagrama, apenas ADD COLUMN é suportado. Existe uma solução alternativa (meio pesada): http://www.sqlite.org/faq.html#q11
fonte
Não podemos descartar uma coluna específica no SQLite 3. Consulte as Perguntas frequentes .
fonte
Como outros já apontaram, a
ALTER TABLE
declaração do sqlite não suportaDROP COLUMN
, e a receita padrão para fazer isso não preserva restrições e índices.Aqui está um código python para fazer isso de maneira genérica, mantendo todas as principais restrições e índices.
Faça backup do seu banco de dados antes de usar! Essa função depende de medicar a instrução CREATE TABLE original e é potencialmente um pouco insegura - por exemplo, ela fará a coisa errada se um identificador contiver uma vírgula ou parêntese incorporado.
Se alguém quiser contribuir com uma maneira melhor de analisar o SQL, isso seria ótimo!
ATUALIZAÇÃO Encontrei uma maneira melhor de analisar usando o
sqlparse
pacote decódigo aberto. Se houver algum interesse, vou postá-lo aqui, basta deixar um comentário pedindo ...fonte
Eu reescrevi a resposta @Udinic para que o código gera consulta de criação de tabela automaticamente . Também não precisa
ConnectionSource
. Ele também precisa fazer isso dentro de uma transação .fonte
O DB Browser for SQLite permite adicionar ou soltar colunas.
Na vista principal, guia Database Structure, clique no nome da tabela. Um botão Modify Tableé ativado, o que abre uma nova janela onde você pode selecionar a coluna / campo e removê-la.
fonte
você pode usar o Sqlitebrowser. No modo de navegador, para o respectivo banco de dados e a tabela, na estrutura da guia -database, seguindo a opção Modify Table, a respectiva coluna pode ser removida.
fonte
Eu acho que o que você quer fazer é a migração de banco de dados. 'Soltar' uma coluna não existe no SQLite. Mas você pode, no entanto, adicionar uma coluna extra usando a consulta da tabela ALTER.
fonte
Você pode usar o SQlite Administrator para alterar os nomes das colunas. Clique com o botão direito do mouse no nome da tabela e selecione Editar tabela. Aqui você encontrará a estrutura da tabela e poderá renomeá-la facilmente.
fonte
Como o SQLite possui suporte limitado ao ALTER TABLE, você pode adicionar apenas a coluna no final da tabela OR CHANGE TABLE_NAME no SQLite.
Aqui está a melhor resposta de COMO EXCLUIR A COLUNA DO SQLITE?
visite Excluir coluna da tabela SQLite
fonte
Como uma alternativa:
Se você tiver uma tabela com esquema
você pode usar uma
CREATE TABLE...AS
declaração comoCREATE TABLE person2 AS SELECT id, first_name, last_name, age FROM person;
, por exemplo, deixar de fora as colunas que não deseja. Solte aperson
tabela original e renomeie a nova.Observe que este método produz uma tabela sem PRIMARY KEY e sem restrições. Para preservá-las, utilize os métodos descritos para criar uma nova tabela ou use uma tabela temporária como intermediária.
fonte
Esta resposta a uma pergunta diferente é orientada para a modificação de uma coluna, mas acredito que uma parte da resposta também pode fornecer uma abordagem útil se você tiver muitas colunas e não quiser redigitar a maioria delas manualmente para sua instrução INSERT:
https://stackoverflow.com/a/10385666
Você pode despejar seu banco de dados conforme descrito no link acima, pegar a instrução "create table" e um modelo "insert" desse despejo, e seguir as instruções na entrada da SQLite FAQ "Como adicionar ou excluir colunas de um existente tabela no SQLite ". (As perguntas frequentes estão vinculadas a outros lugares desta página.)
fonte
Implementação
Python
baseada em informações em http://www.sqlite.org/faq.html#q11 .Esse script cria primeiro uma tabela temporária aleatória e insere dados apenas das colunas necessárias, exceto a que será descartada. Em seguida, restaura a tabela original com base na tabela temporária e descarta a tabela temporária.
fonte
Minha solução, só preciso chamar esse método.
E método auxiliar para obter as colunas:
fonte
Eu melhorei a resposta user2638929 e agora pode preservar o tipo de coluna, chave primária, valor padrão etc.
PS. Eu usei aqui
android.arch.persistence.db.SupportSQLiteDatabase
, mas você pode modificá-lo facilmente para usoandroid.database.sqlite.SQLiteDatabase
fonte
e apenas chame um método
fonte
exemplo para adicionar uma coluna: -
aqui student é table_name e TOB é column_name a ser adicionado.
Está funcionando e testado.
fonte
Agora você também pode usar o navegador DB para SQLite para manipular colunas
fonte