2016-08-02 55 views
2

我有一个由sqlite表支持的ContentProvider。所以创建我的表我使用alter sqlite表在多列上添加唯一约束

public class H extends SQLiteOpenHelper { 
    @Override 
    public void onCreate(SQLiteDatabase sqliteDatabase) { 
    …// here I defined my original table without constraints 
    } 
} 

最初创建时,该表具有列:name,age,height。没有限制。没有。

现在我需要添加约束到表。所以我增加了DATABASE_VERSION,然后在onCreate String中添加了UNIQUE(name,age) ON CONFLICT REPLACE。 我的问题是,我应该怎么做onUpgrade方法?更简单地说:我怎样才能拨打ALTER TABLE来增加限制?我尝试失败

ALTER TABLE myTable ADD UNIQUE(name,age) ON CONFLICT REPLACE 

以下是错误消息:

Caused by: android.database.sqlite.SQLiteException: near "CONSTRAINT": syntax error (code 1): , while compiling: ALTER TABLE myTable ADD CONSTRAINT UNIQUE(name,age) ON CONFLICT REPLACE 
################################################################# 
Error Code : 1 (SQLITE_ERROR) 
Caused By : SQL(query) error or missing database. 
    (near "CONSTRAINT": syntax error (code 1): , while compiling: ALTER TABLE myTable ADD CONSTRAINT UNIQUE(name,age) ON CONFLICT REPLACE) 

回答

0

修改表中SQLite是相当有限的。然而,您的目的CREATE UNIQUE INDEX也适用。

创建唯一约束与创建唯一索引之间通常没有区别。参见:
SQLite - Any difference between table-constraint UNIQUE & column-constraint UNIQUE?https://dba.stackexchange.com/questions/144/when-should-i-use-a-unique-constraint-instead-of-a-unique-index

所以你的情况改变你的代码,使用应更改代码在你的onCreate使用CREATE INDEX的语法来代替。

请注意,如果您的表已经有重复的条目,这可能仍然失败。

0

你不能在SQLite的一个ALTER TABLE添加约束。

仅支持ALTER TABLE 命令的RENAME TABLE和ADD COLUMN变体。其他类型的ALTER TABLE操作(例如 DROP COLUMN,ALTER COLUMN,ADD CONSTRAINT等)将被省略。

http://www.sqlite.org/omitted.html