SQLite alter column删除约束

时间:2016-04-10 22:50:07

标签: android sqlite android-sqlite

我有一个带有NOT NULL约束的列。我需要更改数据库以删除约束。但是当我尝试从android

获得重复的列异常时
db.execSQL("ALTER TABLE " + AnimalContract.DogEntry.TABLE_NAME
+ " ADD COLUMN " + AnimalContract.DogEntry.COLUMN_NAME+" TEXT DEFAULT NULL");

我也尝试过没有DEFAULT

约束为UNIQUE NOT NULL

1 个答案:

答案 0 :(得分:4)

在sqlite中没有 ALTER COLUMN 的直接方式。

我相信你唯一的选择是:

  • 将表重命名为临时名称
  • 创建没有NOT NULL约束的新表
  • 将旧表格的内容复制到新表格
  • 删除旧表

This other Stackoverflow answer详细解释了该过程

此外,

表格中的修改栏

您无法使用ALTER TABLE语句修改SQLite中的列。相反,您需要重命名表,创建新表,并将数据复制到新表中。

<强>语法

  

SQLite中表中MODIFY A COLUMN的语法是:

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表中的列。

     

例如,如果我们有一个employees表,其中有一个名为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表重命名为_employees_old。 &gt;然后它将创建new employees表,并将last_name字段定义为VARCHAR数据类型。然后,它会将_employees_old表中的所有数据插入到employees表中。