2016-08-02 96 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