2010-04-23 147 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