Supprimer la colonne de la table SQLite

J’ai un problème: je dois supprimer une colonne de ma firebase database SQLite. J’ai écrit cette requête

alter table table_name drop column column_name 

mais ça ne marche pas. Aidez-moi, s’il vous plaît.

De: http://www.sqlite.org/faq.html :

(11) Comment append ou supprimer des colonnes d’une table existante dans SQLite?

SQLite dispose d’un support ALTER TABLE limité que vous pouvez utiliser pour append une colonne à la fin d’une table ou pour modifier le nom d’une table. Si vous souhaitez apporter des modifications plus complexes à la structure d’une table, vous devrez recréer la table. Vous pouvez enregistrer les données existantes dans une table temporaire, supprimer l’ancienne table, créer la nouvelle table, puis copier les données depuis la table temporaire.

Par exemple, supposons que vous ayez une table nommée “t1” avec les colonnes “a”, “b” et “c” et que vous souhaitez supprimer la colonne “c” de cette table. Les étapes suivantes illustrent comment cela pourrait être fait:

 BEGIN TRANSACTION; CREATE TEMPORARY TABLE t1_backup(a,b); INSERT INTO t1_backup SELECT a,b FROM t1; DROP TABLE t1; CREATE TABLE t1(a,b); INSERT INTO t1 SELECT a,b FROM t1_backup; DROP TABLE t1_backup; COMMIT; 

Au lieu de déposer la table de sauvegarde, renommez-la simplement …

 BEGIN TRANSACTION; CREATE TABLE t1_backup(a,b); INSERT INTO t1_backup SELECT a,b FROM t1; DROP TABLE t1; ALTER TABLE t1_backup RENAME TO t1; COMMIT; 

Pour plus de simplicité, pourquoi ne pas créer la table de sauvegarde à partir de l’instruction select?

 CREATE TABLE t1_backup AS SELECT a, b FROM t1; DROP TABLE t1; ALTER TABLE t1_backup RENAME TO t1; 

http://lists.osgeo.org/pipermail/grass-user/2006-January/031981.html

Il existe également un outil appelé Sqliteman qui fournit une option visuelle pour supprimer des colonnes.

Merci Jignesh

=> Créer une nouvelle table directement avec la requête suivante:

 CREATE TABLE Table_name (Column_1 text,Column_2 text); 

=> Maintenant, insérez les données dans la table_name de Existing_table avec la requête suivante:

 insert into Table_name (Column_1,Column_2) FROM Existing_Table; 

=> Maintenant, déposez le fichier Existing_table en suivant la requête:

 DROP Existing_Table; 

Pour SQLite3 c ++:

 void GetTableColNames( tssortingng sTableName , std::vector *pvsCols ) { UASSERT(pvsCols); CppSQLite3Table table1; tssortingng sDML = SsortingngOps::std_sprintf(_T("SELECT * FROM %s") , sTableName.c_str() ); table1 = getTable( SsortingngOps::tssortingngToUTF8ssortingng(sDML).c_str() ); for ( int nCol = 0 ; nCol < table1.numFields() ; nCol++ ) { const char* pch1 = table1.fieldName(nCol); pvsCols->push_back( SsortingngOps::UTF8charTo_tssortingng(pch1)); } } bool ColExists( tssortingng sColName ) { bool bColExists = true; try { tssortingng sQuery = SsortingngOps::std_sprintf(_T("SELECT %s FROM MyOriginalTable LIMIT 1;") , sColName.c_str() ); ShowVerbalMessages(false); CppSQLite3Query q = execQuery( SsortingngOps::tssortingngTo_stdSsortingng(sQuery).c_str() ); ShowVerbalMessages(true); } catch (CppSQLite3Exception& e) { bColExists = false; } return bColExists; } void DeleteColumns( std::vector *pvsColsToDelete ) { UASSERT(pvsColsToDelete); execDML( SsortingngOps::tssortingngTo_stdSsortingng(_T("begin transaction;")).c_str() ); std::vector vsCols; GetTableColNames( _T("MyOriginalTable") , &vsCols ); CreateFields( _T("TempTable1") , false ); tssortingng sFieldNamesSeperatedByCommas; for ( int nCol = 0 ; nCol < vsCols.size() ; nCol++ ) { tstring sColNameCurr = vsCols.at(nCol); bool bUseCol = true; for ( int nColsToDelete = 0; nColsToDelete < pvsColsToDelete->size() ; nColsToDelete++ ) { if ( pvsColsToDelete->at(nColsToDelete) == sColNameCurr ) { bUseCol = false; break; } } if ( bUseCol ) sFieldNamesSeperatedByCommas+= (sColNameCurr + _T(",")); } if ( sFieldNamesSeperatedByCommas.at( int(sFieldNamesSeperatedByCommas.size()) - 1) == _T(',')) sFieldNamesSeperatedByCommas.erase( int(sFieldNamesSeperatedByCommas.size()) - 1 ); tssortingng sDML; sDML = SsortingngOps::std_sprintf(_T("insert into TempTable1 SELECT %s FROM MyOriginalTable;\n") , sFieldNamesSeperatedByCommas.c_str() ); execDML( SsortingngOps::tssortingngTo_stdSsortingng(sDML).c_str() ); sDML = SsortingngOps::std_sprintf(_T("ALTER TABLE MyOriginalTable RENAME TO MyOriginalTable_old\n") ); execDML( SsortingngOps::tssortingngTo_stdSsortingng(sDML).c_str() ); sDML = SsortingngOps::std_sprintf(_T("ALTER TABLE TempTable1 RENAME TO MyOriginalTable\n") ); execDML( SsortingngOps::tssortingngTo_stdSsortingng(sDML).c_str() ); sDML = ( _T("DROP TABLE MyOriginalTable_old;") ); execDML( SsortingngOps::tssortingngTo_stdSsortingng(sDML).c_str() ); execDML( SsortingngOps::tssortingngTo_stdSsortingng(_T("commit transaction;")).c_str() ); } 

Cette option ne fonctionne que si vous pouvez ouvrir la firebase database dans un navigateur de firebase database tel que DB Browser pour SQLite .

Dans le navigateur de firebase database pour SQLite:

  1. Allez dans l’onglet “Structure de la firebase database”
  2. Sélectionnez votre table Sélectionnez Modifier la table (juste sous les tabs)
  3. Sélectionnez la colonne que vous souhaitez supprimer
  4. Cliquez sur Supprimer le champ et cliquez sur OK

Si quelqu’un a besoin d’une fonction PHP (presque) prête à l’emploi, la réponse est la suivante:

 /** * Remove a column from a table. * * @param ssortingng $tableName The table to remove the column from. * @param ssortingng $columnName The column to remove from the table. */ public function DropTableColumn($tableName, $columnName) { // -- // Determine all columns except the one to remove. $columnNames = array(); $statement = $pdo->prepare("PRAGMA table_info($tableName);"); $statement->execute(array()); $rows = $statement->fetchAll(PDO::FETCH_OBJ); $hasColumn = false; foreach ($rows as $row) { if(strtolower($row->name) !== strtolower($columnName)) { array_push($columnNames, $row->name); } else { $hasColumn = true; } } // Column does not exist in table, no need to do anything. if ( !$hasColumn ) return; // -- // Actually execute the SQL. $columns = implode('`,`', $columnNames); $statement = $pdo->exec( "CREATE TABLE `t1_backup` AS SELECT `$columns` FROM `$tableName`; DROP TABLE `$tableName`; ALTER TABLE `t1_backup` RENAME TO `$tableName`;"); } 

Contrairement aux autres réponses, le SQL utilisé dans cette approche semble préserver les types de données des colonnes, alors que quelque chose comme la réponse acceptée semble donner le type TEXT à toutes les colonnes.

Mise à jour 1:

Le SQL utilisé présente l’inconvénient que les colonnes à autoincrementautoincrement ne sont pas conservées.