2016-04-10 8 views
2

У меня есть столбец с ограничением NOT NULL. Мне нужно изменить базу данных, чтобы удалить ограничение. Но когда я пытаюсь я получаю дубликат исключение столбцов из андроидаSQLite alter column для удаления ограничения

db.execSQL("ALTER TABLE " + AnimalContract.DogEntry.TABLE_NAME 
+ " ADD COLUMN " + AnimalContract.DogEntry.COLUMN_NAME+" TEXT DEFAULT NULL"); 

Я также попытался без DEFAULT

Ограничения было UNIQUE NOT NULL

ответ

3

Там нет прямого пути к ALTER COLUMN в SQLite.

Я считаю, что единственный вариант заключается в следующем:

  • Переименовать таблицу во временное имя
  • Создать новую таблицу без NOT NULL ограничения
  • Скопируйте содержимое старой таблицы в новую один
  • Удалить старую таблицу

This other Stackoverflow answer объясняет процесс в деталях

Кроме того,

ИЗМЕНИТЬ КОЛОННА В ТАБЛИЦЕ

Вы не можете использовать оператор ALTER TABLE для изменения столбца в SQLite. Вместо этого вам нужно будет переименовать таблицу, создать новую таблицу и скопировать данные в новую таблицу.

Синтаксис

Синтаксис ИЗМЕНИТЬ столбцом в таблице в SQLite является:

PRAGMA foreign_keys=off; 

BEGIN TRANSACTION; 

ALTER TABLE table1 RENAME TO _table1_old; 

CREATE TABLE table1 (
(column1 datatype [ NULL | NOT NULL ], 
    column2 datatype [ NULL | NOT NULL ], 
    ... 
); 

INSERT INTO table1 (column1, column2) 
SELECT column1, column2 
    FROM _table1_old; 

COMMIT; 

PRAGMA foreign_keys=on; 

Пример

Давайте посмотрим на пример, который показывает, как для изменения столбца в таблице SQLite.

Например, если бы мы имели таблицу сотрудников, которые имели столбец под названием last_name, который был определен как CHAR тип данных:

CREATE TABLE employees 
(employee_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    last_name CHAR NOT NULL, 
    first_name VARCHAR, 
    hire_date DATE 
); 

И мы хотели изменить тип данных на last_name поле для VARCHAR, мы могли бы сделать следующее:

PRAGMA foreign_keys=off; 

BEGIN TRANSACTION; 

ALTER TABLE employees RENAME TO _employees_old; 

CREATE TABLE employees 
(employee_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    last_name VARCHAR NOT NULL, 
    first_name VARCHAR, 
    hire_date DATE 

);

INSERT INTO employees (employee_id, last_name, first_name, hire_date) 
    SELECT employee_id, last_name, first_name, hire_date 
    FROM _employees_old; 

COMMIT; 

PRAGMA foreign_keys=on; 

Этот пример переименовывать наша таблица существующих сотрудников к _employees_old. > Затем он создаст новую таблицу сотрудников с полем last_name, определенным как тип данных VARCHAR. Затем он будет вставлять все данные из таблицы _employees_old в таблицу сотрудников.

Смежные вопросы