修改SQLite表以在多个列上添加唯一约束条件

6

我有一个由SQLite表支持的ContentProvider。为了创建我的表格,我使用了下面的代码:

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

当最初创建表时,它有三列:姓名、年龄和身高。没有约束条件,什么也没有。
现在我需要向表中添加约束条件。因此,我增加了DATABASE_VERSION,并在onCreate字符串中添加了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个回答

5

在SQLite中,ALTER TABLE功能比较有限。但对于您的目的,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语法。

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


1

在SQLite中,您无法使用ALTER TABLE添加约束。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接