我有一个带有NOT NULL约束的列。我需要更改数据库以删除约束。但是当我尝试从android
获得重复的列异常时db.execSQL("ALTER TABLE " + AnimalContract.DogEntry.TABLE_NAME
+ " ADD COLUMN " + AnimalContract.DogEntry.COLUMN_NAME+" TEXT DEFAULT NULL");
我也尝试过没有DEFAULT
约束为UNIQUE NOT NULL
答案 0 :(得分:4)
在sqlite中没有 ALTER COLUMN 的直接方式。
我相信你唯一的选择是:
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表中。