Android SQLite alter列以删除约束

Android SQLite alter列以删除约束,android,sqlite,android-sqlite,Android,Sqlite,Android Sqlite,我有一个具有NOTNULL约束的列。我需要修改数据库以删除约束。但当我尝试时,我从android获得了一个重复的列异常 db.execSQL("ALTER TABLE " + AnimalContract.DogEntry.TABLE_NAME + " ADD COLUMN " + AnimalContract.DogEntry.COLUMN_NAME+" TEXT DEFAULT NULL"); 我也没有默认地尝试过 约束是UNIQUE NOT NULL在SQLite中没有直接方法更改列 我

我有一个具有NOTNULL约束的列。我需要修改数据库以删除约束。但当我尝试时,我从android获得了一个重复的列异常

db.execSQL("ALTER TABLE " + AnimalContract.DogEntry.TABLE_NAME
+ " ADD COLUMN " + AnimalContract.DogEntry.COLUMN_NAME+" TEXT DEFAULT NULL");
我也没有默认地尝试过


约束是
UNIQUE NOT NULL

在SQLite中没有直接方法更改列

我相信你唯一的选择是:

  • 将表重命名为临时名称
  • 创建没有NOTNULL约束的新表
  • 将旧表的内容复制到新表
  • 移走那张旧桌子
详细解释该过程

此外,

修改表中的列

不能使用ALTERTABLE语句修改SQLite中的列。相反,您需要重命名该表,创建一个新表,然后将数据复制到新表中

语法

在SQLite中修改表中的列的语法为:

范例

让我们看一个示例,该示例演示如何修改SQLite表中的列

例如,如果我们有一个employees表,其中有一个名为last_name的列,该列被定义为CHAR数据类型:

我们想将last_name字段的数据类型更改为VARCHAR,我们可以执行以下操作:

此示例将现有employees表重命名为_employees_old。 然后,它将创建新的employees表,其中last_name字段定义为VARCHAR数据类型。然后它将把_employees_旧表中的所有数据插入employees表

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;
CREATE TABLE employees
( employee_id INTEGER PRIMARY KEY AUTOINCREMENT,
  last_name CHAR NOT NULL,
  first_name VARCHAR,
  hire_date DATE
);
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;