2010-04-23 185 views
150

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

CREATE TABLE name (column defs) 
UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE 

我基于以下这样:

table-constraint

要清楚,我所提供的链接的文件说,应该CONTSTRAINT name我约束定义之前。

可能导致解决方案的东西是,无论在括号括起来的列定义之后,调试器都会抱怨什么。

如果我把

...last_column_name last_col_datatype) CONSTRAINT ... 

错误是附近的 “约束”:语法错误

如果我把

...last_column_name last_col_datatype) UNIQUE ... 

错误是附近的 “独一无二”:语法错误

+1

UNIQUE在开始之前缺少一个逗号。 – magid 2016-11-29 06:48:55

回答

305

把列定义节中的唯一声明:

CREATE TABLE name (column defs, UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE); 

工作例如:

CREATE TABLE a (i INT, j INT, UNIQUE(i, j) ON CONFLICT REPLACE); 
+0

哇。我可以让你的简单例子完美地工作。一个更复杂的例子是踢我的屁股。当你有十几个人时,很难找到多余的括号。我终于搞定了。感谢您的简洁回答。 – Justin 2011-08-26 20:08:28

+4

不错的答案+1。 此创建语法是否允许我使用常规插入方法,而不是SQLiteDatabase.CONFLICT_REPLACE标志的insertWithOnConflict? – 2014-01-25 16:23:34

+1

我使用'ON CONFLICT IGNORE'(还没有尝试替换)超过2列,但我没有看到它荣幸的独特约束,它只是愉快地添加重复。 – Michael 2014-07-17 00:10:58

7

那么,你的语法,包括链接不匹配,它规定:

CREATE TABLE name (column defs) 
    CONSTRAINT constraint_name -- This is new 
    UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE 
+0

我最初那样做...没有奏效。我再次尝试过,以防万一......仍然不起作用 – Rich 2010-04-23 20:48:52

+5

Ayman有答案。 。 。 – 2010-04-23 20:52:47

+1

CREATE TABLE name(column defs, CONSTRAINT constraint_name - 这是新的UNIQUE(col_name1,col_name2)ON冲突REPLACE) – Afwas 2013-07-22 00:15:36