SQLite表约束 - 在多列上唯一

Ric*_*ich 172 sqlite compound-key unique-constraint

我可以在SQLite网站上找到关于此的语法"图表",但没有示例和我的代码崩溃.我在单个列上有其他具有唯一约束的表,但我想在两列上向表添加约束.这就是我所带来的SQLiteException,消息"语法错误".

CREATE TABLE name (column defs) 
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
Run Code Online (Sandbox Code Playgroud)

我这样做是基于以下几点:

表约束

为了清楚起见,我提供的链接上的文档说明CONTSTRAINT name应该在我的约束定义之前.

可能导致解决方案的一点是,无论我的括号列定义如何,调试器都会抱怨.

如果我放

...last_column_name last_col_datatype) CONSTRAINT ...
Run Code Online (Sandbox Code Playgroud)

错误接近"CONSTRAINT":语法错误

如果我放

...last_column_name last_col_datatype) UNIQUE ...
Run Code Online (Sandbox Code Playgroud)

错误接近"UNIQUE":语法错误

Aym*_*ieh 336

将UNIQUE声明放在列定义部分中:

CREATE TABLE name (column defs, UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE);
Run Code Online (Sandbox Code Playgroud)

工作范例:

CREATE TABLE a (i INT, j INT, UNIQUE(i, j) ON CONFLICT REPLACE);
Run Code Online (Sandbox Code Playgroud)

  • 不错的答案+1.这是否允许我使用常规插入方法,而不是使用带有SQLiteDatabase.CONFLICT_REPLACE标志的insertWithOnConflict? (6认同)
  • 请注意使用“ON CONFLICT REPLACE”,它可能不是您想要的——它会删除预先存在的行以允许插入新行。通常,我想中止或回滚约束违规。[SQLite ON CONFLICT 子句](https://sqlite.org/lang_conflict.html) (6认同)
  • 显然是因为我有空列,而这只是从窗口射出独特的检查 (5认同)
  • 我正在使用超过2列的"ON CONFLICT IGNORE"(尚未尝试替换),但我没有看到它尊重唯一约束,它只是快乐地添加重复项. (3认同)
  • sqlite 将所有 NULL 值视为不同的,因此如果您的唯一列包含 NULL,那么这些行可能会重复。 (3认同)

Lar*_*tig 9

好吧,您的语法与您包含的链接不匹配,它指定:

 CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name    -- This is new
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE
Run Code Online (Sandbox Code Playgroud)


Ole*_*kov 8

如果您已经有一个表并且由于某种原因不能/不想重新创建它,请使用索引

CREATE UNIQUE INDEX my_index ON my_table(col_1, col_2);
Run Code Online (Sandbox Code Playgroud)