[SQL] SQLite는 테이블에서 삭제 열
SQLSQLite는 테이블에서 삭제 열
나는 문제가있다 : 내 SQLite는 데이터베이스에서 열을 삭제해야합니다. 나는이 쿼리를 작성
alter table table_name drop column column_name
그러나 그것은 작동하지 않습니다. 제발 도와주세요.
해결법
-
==============================
1.올린 사람 : http://www.sqlite.org/faq.html :
올린 사람 : http://www.sqlite.org/faq.html :
-
==============================
2.대신 백업 테이블을 삭제의, 그냥 이름을 바꾸 ...
대신 백업 테이블을 삭제의, 그냥 이름을 바꾸 ...
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;
-
==============================
3.단순화를 위해, 왜 select 문에서 백업 테이블을 생성하지?
단순화를 위해, 왜 select 문에서 백업 테이블을 생성하지?
CREATE TABLE t1_backup AS SELECT a, b FROM t1; DROP TABLE t1; ALTER TABLE t1_backup RENAME TO t1;
-
==============================
4.당신이 SQLite는 대한 DB 브라우저와 같은 DB 브라우저에서 DB를 열 수있는 경우에만이 옵션을 사용할 수 있습니다.
당신이 SQLite는 대한 DB 브라우저와 같은 DB 브라우저에서 DB를 열 수있는 경우에만이 옵션을 사용할 수 있습니다.
SQLite는 대한 DB 브라우저에서 :
-
==============================
5.=> 다음 쿼리와 직접 새 테이블을 만듭니다 :
=> 다음 쿼리와 직접 새 테이블을 만듭니다 :
CREATE TABLE table_name (Column_1 TEXT,Column_2 TEXT);
=> 이제 다음 쿼리와 existing_table에서 TABLE_NAME에 데이터를 삽입 :
INSERT INTO table_name (Column_1,Column_2) FROM existing_table;
=> 이제 다음 쿼리하여 existing_table 드롭 :
DROP TABLE existing_table;
-
==============================
6.++ sqlite3를 경우 c :
++ 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() ); }
-
==============================
7.난 당신이 인수로 제거 할 수있는 테이블과 열을 입력 파이썬 함수를했습니다 :
난 당신이 인수로 제거 할 수있는 테이블과 열을 입력 파이썬 함수를했습니다 :
def removeColumn(table, column): columns = [] for row in c.execute('PRAGMA table_info(' + table + ')'): columns.append(row[1]) columns.remove(column) columns = str(columns) columns = columns.replace("[", "(") columns = columns.replace("]", ")") for i in ["\'", "(", ")"]: columns = columns.replace(i, "") c.execute('CREATE TABLE temptable AS SELECT ' + columns + ' FROM ' + table) c.execute('DROP TABLE ' + table) c.execute('ALTER TABLE temptable RENAME TO ' + table) conn.commit()
Duda 보낸 년대와 MeBigFatGuy의 응답이 테이블에 외래 키가이지만,이 코드의 2 개 라인 (새 테이블을 생성하고 바로 임시 테이블의 이름을 변경하지 않음)로 고정 할 수있는 경우이하지 않습니다 작업에 대한 정보에 따라
-
==============================
8.경우 사람이 다음이 대답을 기반으로하는 (거의) 즉시 사용 가능한 PHP 함수가 필요합니다 :
경우 사람이 다음이 대답을 기반으로하는 (거의) 즉시 사용 가능한 PHP 함수가 필요합니다 :
/** * 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`;"); }
다른 답변과는 달리,이 방법에 사용되는 SQL은 허용 대답과 같은 유형의 텍스트로 모든 열이 발생할 것으로 보인다 반면, 컬럼의 데이터 유형을 보존하는 것 같다.
업데이트 1 :
사용 된 SQL은 자동 증가 열이 보존되지 않는다는 단점이있다.
-
==============================
9.이런 경우에 그것은 나 같은 사람을 도울 수 있다면.
이런 경우에 그것은 나 같은 사람을 도울 수 있다면.
공식 웹 사이트 및 수락 응답을 바탕으로, 나는 System.Data.SQLite NuGet 패키지를 사용하여 C #을 사용 코드를했다.
이 코드는 기본 키와 외래 키를 유지합니다.
C #에서 CODE :
void RemoveColumnFromSqlite (string tableName, string columnToRemove) { try { var mSqliteDbConnection = new SQLiteConnection ("Data Source=db_folder\\MySqliteBasedApp.db;Version=3;Page Size=1024;"); mSqliteDbConnection.Open (); // Reads all columns definitions from table List<string> columnDefinition = new List<string> (); var mSql = $"SELECT type, sql FROM sqlite_master WHERE tbl_name='{tableName}'"; var mSqliteCommand = new SQLiteCommand (mSql, mSqliteDbConnection); string sqlScript = ""; using (mSqliteReader = mSqliteCommand.ExecuteReader ()) { while (mSqliteReader.Read ()) { sqlScript = mSqliteReader["sql"].ToString (); break; } } if (!string.IsNullOrEmpty (sqlScript)) { // Gets string within first '(' and last ')' characters int firstIndex = sqlScript.IndexOf ("("); int lastIndex = sqlScript.LastIndexOf (")"); if (firstIndex >= 0 && lastIndex <= sqlScript.Length - 1) { sqlScript = sqlScript.Substring (firstIndex, lastIndex - firstIndex + 1); } string[] scriptParts = sqlScript.Split (new string[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (string s in scriptParts) { if (!s.Contains (columnToRemove)) { columnDefinition.Add (s); } } } string columnDefinitionString = string.Join (",", columnDefinition); // Reads all columns from table List<string> columns = new List<string> (); mSql = $"PRAGMA table_info({tableName})"; mSqliteCommand = new SQLiteCommand (mSql, mSqliteDbConnection); using (mSqliteReader = mSqliteCommand.ExecuteReader ()) { while (mSqliteReader.Read ()) columns.Add (mSqliteReader["name"].ToString ()); } columns.Remove (columnToRemove); string columnString = string.Join (",", columns); mSql = "PRAGMA foreign_keys=OFF"; mSqliteCommand = new SQLiteCommand (mSql, mSqliteDbConnection); int n = mSqliteCommand.ExecuteNonQuery (); // Removes a column from the table using (SQLiteTransaction tr = mSqliteDbConnection.BeginTransaction ()) { using (SQLiteCommand cmd = mSqliteDbConnection.CreateCommand ()) { cmd.Transaction = tr; string query = $"CREATE TEMPORARY TABLE {tableName}_backup {columnDefinitionString}"; cmd.CommandText = query; cmd.ExecuteNonQuery (); cmd.CommandText = $"INSERT INTO {tableName}_backup SELECT {columnString} FROM {tableName}"; cmd.ExecuteNonQuery (); cmd.CommandText = $"DROP TABLE {tableName}"; cmd.ExecuteNonQuery (); cmd.CommandText = $"CREATE TABLE {tableName} {columnDefinitionString}"; cmd.ExecuteNonQuery (); cmd.CommandText = $"INSERT INTO {tableName} SELECT {columnString} FROM {tableName}_backup;"; cmd.ExecuteNonQuery (); cmd.CommandText = $"DROP TABLE {tableName}_backup"; cmd.ExecuteNonQuery (); } tr.Commit (); } mSql = "PRAGMA foreign_keys=ON"; mSqliteCommand = new SQLiteCommand (mSql, mSqliteDbConnection); n = mSqliteCommand.ExecuteNonQuery (); } catch (Exception ex) { HandleExceptions (ex); } }
from https://stackoverflow.com/questions/5938048/delete-column-from-sqlite-table by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 두 날짜 사이의 차이 (0) | 2020.03.25 |
---|---|
[SQL] 쉼표로 구분 한 값과 복수의 열 [중복] (0) | 2020.03.25 |
[SQL] MySQL은 "그룹으로"와 "주문" (0) | 2020.03.25 |
[SQL] 당신은 어떻게 psql의에서 스크립트 변수를 사용합니까? (0) | 2020.03.25 |
[SQL] JDBC와 MySQL의를 사용하여 .SQL 스크립트를 실행 (0) | 2020.03.25 |