alter sqlite table为多列添加唯一约束

时间:2016-08-02 22:08:26

标签: android sqlite android-sqlite android-contentprovider

我有一个由sqlite表支持的ContentProvider。所以为了创建我的表,我使用了

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

最初创建时,表格包含以下列:名称,年龄,高度。没有限制。什么都没有。

现在我需要为表添加约束。所以我增加了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)

2 个答案:

答案 0 :(得分:0)

您无法在SQLite中添加{{1}}的约束。

  

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

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

答案 1 :(得分: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语法。

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