更改 sqlite 表以在多列上添加唯一约束

Nou*_*vay 6 sqlite android android-contentprovider android-sqlite

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

\n\n
public class H extends SQLiteOpenHelper {\n  @Override\n  public void onCreate(SQLiteDatabase sqliteDatabase) {\n    \xe2\x80\xa6// here I defined my original table without constraints\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

最初创建时,该表具有以下列:姓名、年龄、身高。没有限制。没有什么。

\n\n

现在我需要向表添加约束。所以我增加了 DATABASE_VERSION,然后在 onCreate String 中添加了UNIQUE(name,age) ON CONFLICT REPLACE。\n我的问题是,我应该在方法内部做什么onUpgrade?更简单地说:我如何调用ALTER TABLE仅添加约束?我的尝试失败了

\n\n
ALTER TABLE myTable ADD UNIQUE(name,age) ON CONFLICT REPLACE\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是错误消息:

\n\n
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\n#################################################################\nError Code : 1 (SQLITE_ERROR)\nCaused By : SQL(query) error or missing database.\n    (near "CONSTRAINT": syntax error (code 1): , while compiling: ALTER TABLE myTable ADD CONSTRAINT UNIQUE(name,age) ON CONFLICT REPLACE)\n
Run Code Online (Sandbox Code Playgroud)\n

e4c*_*4c5 5

Alter table 在 sqlite 中相当有限。然而,出于您的目的,CREATE UNIQUE INDEX也同样有效。

一般来说,创建唯一约束与创建唯一索引之间没有区别。请参阅:
SQLite - 表约束 UNIQUE 和列约束 UNIQUE 之间有什么区别? https://dba.stackexchange.com/questions/144/when-should-i-use-a-unique-constraint-instead-of-a-unique-index

因此,在您的情况下,更改要使用的代码应该更改 onCreate 中的代码以使用 CREATE INDEX 语法。

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