2010-04-23 17 views
150

Mogę znaleźć "wykresy" składni na ten temat na stronie SQLite, ale nie ma przykładów i mój kod się zawiesza. Mam inne tabele z unikalnymi ograniczeniami w jednej kolumnie, ale chcę dodać ograniczenie do tabeli w dwóch kolumnach. To jest to, co powoduje wyjątek SQLiteException z komunikatem "błąd składni".Ograniczenie tabeli SQLite - unikalne dla wielu kolumn

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

Robię to oparte na następujących zasadach:

table-constraint

Żeby było jasne, dokumentacja na link I przewidzianych mówi, że CONTSTRAINT name powinny pochodzić przed moim definicja ograniczenia.

Coś, co może prowadzić do rozwiązania tego problemu, polega na tym, że cokolwiek podąża za moimi nawiasami, to na co debagger się skarży.

Jeśli kładę

...last_column_name last_col_datatype) CONSTRAINT ... 

błąd jest blisko "CONSTRAINT": błąd składni

Jeśli kładę

...last_column_name last_col_datatype) UNIQUE ... 

błąd jest blisko "unikalne": syntax błąd

+1

:

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

przykład Praca UNIQUE nie ma przecinka przed jego uruchomieniem. – magid

Odpowiedz

305

Umieść UNIQUE oświadczenie w sekcji definicji kolumna:

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

Wow. Mogę sprawić, żeby twój prosty przykład działał idealnie. Bardziej złożonym przykładem było kopanie mojego tyłka. Na pewno trudno jest znaleźć nadmiar nawiasów, kiedy masz ich kilkanaście. W końcu udało mi się to zrobić. Dzięki za zwięzłą odpowiedź. – Justin

+4

Dobra odpowiedź +1. Czy ta składnia pozwala mi używać standardowej metody wstawiania, a nie wstawieniaWithOnConflict z flagą SQLiteDatabase.CONFLICT_REPLACE? –

+1

Używam 'NA KONFLIKTOWI IGNORE' (nie próbowałem jeszcze zastąpić) z więcej niż 2 kolumnami, ale nie widzę tego z zastrzeżeniem unikalnego ograniczenia, po prostu wesoło dodaje duplikaty. – Michael

7

dobrze, składnia nie pasuje Ci link dołączony, która określa:

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

Początkowo to zrobiłem ... nie działa. Spróbowałem jeszcze raz na wszelki wypadek ... nadal nie działa – Rich

+5

Ayman ma odpowiedź. . . –

+1

CREATE TABLE nazwa (kolumna defs, CONSTRAINT nazwa_ograniczenia - To jest nowa UNIQUE (nazwa_ coli1, nazwa_kolumny2) NA WYSTĄPI KONFLIKTOWEJ) – Afwas

Powiązane problemy