복붙노트

[SQL] SQLite는 테이블에서 삭제 열

SQL

SQLite는 테이블에서 삭제 열

나는 문제가있다 : 내 SQLite는 데이터베이스에서 열을 삭제해야합니다. 나는이 쿼리를 작성

alter table table_name drop column column_name 

그러나 그것은 작동하지 않습니다. 제발 도와주세요.

해결법

  1. ==============================

    1.올린 사람 : http://www.sqlite.org/faq.html :

    올린 사람 : http://www.sqlite.org/faq.html :

  2. ==============================

    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. ==============================

    3.단순화를 위해, 왜 select 문에서 백업 테이블을 생성하지?

    단순화를 위해, 왜 select 문에서 백업 테이블을 생성하지?

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

    4.당신이 SQLite는 대한 DB 브라우저와 같은 DB 브라우저에서 DB를 열 수있는 경우에만이 옵션을 사용할 수 있습니다.

    당신이 SQLite는 대한 DB 브라우저와 같은 DB 브라우저에서 DB를 열 수있는 경우에만이 옵션을 사용할 수 있습니다.

    SQLite는 대한 DB 브라우저에서 :

  5. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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);
     }
    }
    
  10. from https://stackoverflow.com/questions/5938048/delete-column-from-sqlite-table by cc-by-sa and MIT license