Как удалить или добавить столбец в SQLITE? - PullRequest
210 голосов
/ 09 декабря 2011

Я хочу удалить или добавить столбец в базе данных sqlite

Я использую следующий запрос для удаления столбца.

ALTER TABLE TABLENAME DROP COLUMN COLUMNNAME

Но выдает ошибку

System.Data.SQLite.SQLiteException: SQLite error
near "DROP": syntax error

Ответы [ 20 ]

0 голосов
/ 15 ноября 2017
public void DeleteColFromTable(String DbName, String TableName, String ColName){
    SQLiteDatabase db = openOrCreateDatabase(""+DbName+"", Context.MODE_PRIVATE, null);
    db.execSQL("CREATE TABLE IF NOT EXISTS "+TableName+"(1x00dff);");
    Cursor c = db.rawQuery("PRAGMA table_info("+TableName+")", null);
    if (c.getCount() == 0) {

    } else {
        String columns1 = "";
        String columns2 = "";
        while (c.moveToNext()) {
            if (c.getString(1).equals(ColName)) {
            } else {
                columns1 = columns1 + ", " + c.getString(1) + " " + c.getString(2);
                columns2 = columns2 + ", " + c.getString(1);
            }
            if (c.isLast()) {
                db.execSQL("CREATE TABLE IF NOT EXISTS DataBackup (" + columns1 + ");");
                db.execSQL("INSERT INTO DataBackup SELECT " + columns2 + " FROM "+TableName+";");
                db.execSQL("DROP TABLE "+TableName+"");
                db.execSQL("ALTER TABLE DataBackup RENAME TO "+TableName+";");
            }
        }
    }
}

и просто вызвать метод

DeleteColFromTable("Database name","Table name","Col name which want to delete");
0 голосов
/ 30 мая 2017

Теперь вы также можете использовать браузер БД для SQLite для манипулирования столбцами

0 голосов
/ 13 мая 2017

пример добавления столбца: -

alter table student add column TOB time;

здесь студент - это имя_таблицы и TOB - это имя_ столбца для добавления.

Работает и проверено.

0 голосов
/ 29 ноября 2015

В качестве альтернативы:

Если у вас есть таблица со схемой

CREATE TABLE person(
  id INTEGER PRIMARY KEY,
  first_name TEXT,
  last_name TEXT,
  age INTEGER,
  height INTEGER
);

, вы можете использовать оператор CREATE TABLE...AS, например CREATE TABLE person2 AS SELECT id, first_name, last_name, age FROM person;, то есть пропустить столбцы, которые вы нене хочуЗатем отбросьте исходную таблицу person и переименуйте новую.

Обратите внимание, что этот метод создает таблицу без ПЕРВИЧНОГО КЛЮЧА и без ограничений.Чтобы сохранить их, используйте методы, описанные другими для создания новой таблицы, или используйте временную таблицу в качестве промежуточного.

0 голосов
/ 04 октября 2013

Вы можете использовать SQlite Administrator для изменения имен столбцов. Щелкните правой кнопкой мыши по имени таблицы и выберите «Редактировать таблицу». Здесь вы найдете структуру таблицы и сможете легко переименовать ее.

0 голосов
/ 21 февраля 2018

Мое решение, нужно только вызвать этот метод.

public static void dropColumn(SQLiteDatabase db, String tableName, String[] columnsToRemove) throws java.sql.SQLException {
    List<String> updatedTableColumns = getTableColumns(db, tableName);
    updatedTableColumns.removeAll(Arrays.asList(columnsToRemove));
    String columnsSeperated = TextUtils.join(",", updatedTableColumns);

    db.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tableName + "_old;");
    db.execSQL("CREATE TABLE " + tableName + " (" + columnsSeperated + ");");
    db.execSQL("INSERT INTO " + tableName + "(" + columnsSeperated + ") SELECT "
            + columnsSeperated + " FROM " + tableName + "_old;");
    db.execSQL("DROP TABLE " + tableName + "_old;");
}

И вспомогательный метод для получения столбцов:

public static List<String> getTableColumns(SQLiteDatabase db, String tableName) {
    ArrayList<String> columns = new ArrayList<>();
    String cmd = "pragma table_info(" + tableName + ");";
    Cursor cur = db.rawQuery(cmd, null);

    while (cur.moveToNext()) {
        columns.add(cur.getString(cur.getColumnIndex("name")));
    }
    cur.close();

    return columns;
}
0 голосов
/ 30 июля 2018

Я улучшил user2638929 ответ и теперь он может сохранять тип столбца, первичный ключ, значение по умолчанию и т. Д.

private static void dropColumn(SupportSQLiteDatabase database, String tableName, List<String> columnsToRemove){
    List<String> columnNames = new ArrayList<>();
    List<String> columnNamesWithType = new ArrayList<>();
    List<String> primaryKeys = new ArrayList<>();
    String query = "pragma table_info(" + tableName + ");";
    Cursor cursor = database.query(query);
    while (cursor.moveToNext()){
        String columnName = cursor.getString(cursor.getColumnIndex("name"));

        if (columnsToRemove.contains(columnName)){
            continue;
        }

        String columnType = cursor.getString(cursor.getColumnIndex("type"));
        boolean isNotNull = cursor.getInt(cursor.getColumnIndex("notnull")) == 1;
        boolean isPk = cursor.getInt(cursor.getColumnIndex("pk")) == 1;

        columnNames.add(columnName);
        String tmp = "`" + columnName + "` " + columnType + " ";
        if (isNotNull){
            tmp += " NOT NULL ";
        }

        int defaultValueType = cursor.getType(cursor.getColumnIndex("dflt_value"));
        if (defaultValueType == Cursor.FIELD_TYPE_STRING){
            tmp += " DEFAULT " + "\"" + cursor.getString(cursor.getColumnIndex("dflt_value")) + "\" ";
        }else if(defaultValueType == Cursor.FIELD_TYPE_INTEGER){
            tmp += " DEFAULT " + cursor.getInt(cursor.getColumnIndex("dflt_value")) + " ";
        }else if (defaultValueType == Cursor.FIELD_TYPE_FLOAT){
            tmp += " DEFAULT " + cursor.getFloat(cursor.getColumnIndex("dflt_value")) + " ";
        }
        columnNamesWithType.add(tmp);
        if (isPk){
            primaryKeys.add("`" + columnName + "`");
        }
    }
    cursor.close();

    String columnNamesSeparated = TextUtils.join(", ", columnNames);
    if (primaryKeys.size() > 0){
        columnNamesWithType.add("PRIMARY KEY("+ TextUtils.join(", ", primaryKeys) +")");
    }
    String columnNamesWithTypeSeparated = TextUtils.join(", ", columnNamesWithType);

    database.beginTransaction();
    try {
        database.execSQL("ALTER TABLE " + tableName + " RENAME TO " + tableName + "_old;");
        database.execSQL("CREATE TABLE " + tableName + " (" + columnNamesWithTypeSeparated + ");");
        database.execSQL("INSERT INTO " + tableName + " (" + columnNamesSeparated + ") SELECT "
                + columnNamesSeparated + " FROM " + tableName + "_old;");
        database.execSQL("DROP TABLE " + tableName + "_old;");
        database.setTransactionSuccessful();
    }finally {
        database.endTransaction();
    }
}

PS. Я использовал здесь android.arch.persistence.db.SupportSQLiteDatabase, но вы можете легко изменить его для использования android.database.sqlite.SQLiteDatabase

0 голосов
/ 08 января 2016

Этот ответ на другой вопрос ориентирован на изменение столбца, но я полагаю, что часть ответа может также дать полезный подход, если у вас много столбцов и вы не хотите набирать большинствоиз них вручную для вашего оператора INSERT:

https://stackoverflow.com/a/10385666

Вы можете вывести свою базу данных, как описано в приведенной выше ссылке, а затем получить оператор «создать таблицу» и шаблон «вставить»из этого дампа, затем следуйте инструкциям в разделе часто задаваемых вопросов SQLite «Как добавить или удалить столбцы из существующей таблицы в SQLite».(ЧаВо находится в другом месте на этой странице.)

0 голосов
/ 17 июля 2019

Браузер БД для SQLite позволяет добавлять или удалять столбцы.

0 голосов
/ 23 мая 2016

вы можете использовать Sqlitebrowser. В режиме браузера для соответствующей базы данных и таблицы в структуре tab -database, после опции Modify Table, можно удалить соответствующий столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...