Usuń kolumnę z tabeli SQLite
Mam problem: muszę usunąć kolumnę z bazy danych SQLite. Napisałem to zapytanie
alter table table_name drop column column_name
Ale to nie działa. Proszę, pomóż mi. 8 answers
From: http://www.sqlite.org/faq.html :
(11) Jak dodać lub usunąć kolumny z istniejącej tabeli w SQLite.
SQLite posiada ograniczoną obsługę ALTER TABLE, którą można wykorzystać do dodania kolumna na końcu tabeli lub zmiana nazwy tabeli. Jeśli chcesz dokonać bardziej złożonych zmian w strukturze tabeli, możesz będzie musiał odtworzyć stół. Można zapisać istniejące dane do tymczasowej tabeli, upuść starą tabelę, Utwórz nową tabelę, następnie Kopiuj dane z tymczasowej tabeli.
Na przykład, załóżmy, że masz tabelę o nazwie " t1 " z nazwami kolumn "a", " b " I " c "i że chcesz usunąć kolumnę" c " z tego stolik. Poniższe kroki ilustrują, jak można to zrobić:
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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-02 14:38:17
Zamiast upuszczać tabelę kopii zapasowej, po prostu zmień jej nazwę...
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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-28 13:20:05
Dla uproszczenia, dlaczego nie utworzyć tabeli kopii zapasowej z instrukcji select?
CREATE TABLE t1_backup AS SELECT a, b FROM t1;
DROP TABLE t1;
ALTER TABLE t1_backup RENAME TO t1;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 20:14:15
Http://lists.osgeo.org/pipermail/grass-user/2006-January/031981.html
Istnieje również narzędzie o nazwie Sqliteman , które zapewnia wizualną opcję opuszczania kolumn.
Dzięki, Jignesh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 00:46:26
= > Utwórz nową tabelę bezpośrednio za pomocą następującego zapytania:
CREATE TABLE Table_name (Column_1 text,Column_2 text);
=>Teraz Wstaw dane do table_name z Existing_table za pomocą następującego zapytania:
insert into Table_name (Column_1,Column_2) FROM Existing_Table;
= > Teraz upuść Existing_table, wykonując następujące zapytanie:
DROP Existing_Table;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 08:27:08
Dla SQLite3 c++:
void GetTableColNames( tstring sTableName , std::vector<tstring> *pvsCols )
{
UASSERT(pvsCols);
CppSQLite3Table table1;
tstring sDML = StringOps::std_sprintf(_T("SELECT * FROM %s") , sTableName.c_str() );
table1 = getTable( StringOps::tstringToUTF8string(sDML).c_str() );
for ( int nCol = 0 ; nCol < table1.numFields() ; nCol++ )
{
const char* pch1 = table1.fieldName(nCol);
pvsCols->push_back( StringOps::UTF8charTo_tstring(pch1));
}
}
bool ColExists( tstring sColName )
{
bool bColExists = true;
try
{
tstring sQuery = StringOps::std_sprintf(_T("SELECT %s FROM MyOriginalTable LIMIT 1;") , sColName.c_str() );
ShowVerbalMessages(false);
CppSQLite3Query q = execQuery( StringOps::tstringTo_stdString(sQuery).c_str() );
ShowVerbalMessages(true);
}
catch (CppSQLite3Exception& e)
{
bColExists = false;
}
return bColExists;
}
void DeleteColumns( std::vector<tstring> *pvsColsToDelete )
{
UASSERT(pvsColsToDelete);
execDML( StringOps::tstringTo_stdString(_T("begin transaction;")).c_str() );
std::vector<tstring> vsCols;
GetTableColNames( _T("MyOriginalTable") , &vsCols );
CreateFields( _T("TempTable1") , false );
tstring 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 );
tstring sDML;
sDML = StringOps::std_sprintf(_T("insert into TempTable1 SELECT %s FROM MyOriginalTable;\n") , sFieldNamesSeperatedByCommas.c_str() );
execDML( StringOps::tstringTo_stdString(sDML).c_str() );
sDML = StringOps::std_sprintf(_T("ALTER TABLE MyOriginalTable RENAME TO MyOriginalTable_old\n") );
execDML( StringOps::tstringTo_stdString(sDML).c_str() );
sDML = StringOps::std_sprintf(_T("ALTER TABLE TempTable1 RENAME TO MyOriginalTable\n") );
execDML( StringOps::tstringTo_stdString(sDML).c_str() );
sDML = ( _T("DROP TABLE MyOriginalTable_old;") );
execDML( StringOps::tstringTo_stdString(sDML).c_str() );
execDML( StringOps::tstringTo_stdString(_T("commit transaction;")).c_str() );
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-25 15:17:25
Ta opcja działa tylko wtedy, gdy możesz otworzyć DB w przeglądarce DB, takiej jak DB Browser dla SQLite .
W przeglądarce DB dla SQLite:
- przejdź do zakładki "struktura bazy danych"
- Select you table Select Modify table (tuż pod zakładkami)
- wybierz kolumnę, którą chcesz usunąć
- kliknij Usuń pole i kliknij OK
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 14:20:11
W przypadku, gdy ktoś potrzebuje (prawie) gotowej do użycia funkcji PHP, poniżej znajduje się na podstawie tej odpowiedzi :
/**
* Remove a column from a table.
*
* @param string $tableName The table to remove the column from.
* @param string $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`;");
}
W przeciwieństwie do innych odpowiedzi, SQL używany w tym podejściu wydaje się zachować typy danych kolumn, podczas gdy coś w rodzaju zaakceptowanej odpowiedzi wydaje się skutkować, że wszystkie kolumny są typu TEXT
.
Aktualizacja 1:
Używany SQL ma tę wadę, że autoincrement
kolumny są , a nie zachowane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 05:53:11