2010-04-23 12 views
150

È possibile trovare la sintassi "grafici" su questo nel sito Web SQLite, ma nessun esempio e il mio codice si blocca. Ho altre tabelle con vincoli univoci su una singola colonna, ma voglio aggiungere un vincolo alla tabella su due colonne. Questo è quello che ho che sta causando una SQLiteException con il messaggio "Errore di sintassi".Vincolo della tabella SQLite - unico su più colonne

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

sto facendo questo in base alla seguente:

table-constraint

Per essere chiari, la documentazione sul link che ho fornito dice che CONTSTRAINT name dovrebbe venire prima che la mia definizione del vincolo.

Tuttavia, qualcosa che può portare alla soluzione è che qualunque cosa segua le mie definizioni di colonne tra parentesi è ciò di cui si lamenta il debugger.

Se metto

...last_column_name last_col_datatype) CONSTRAINT ... 

l'errore è vicino "costrizione": errore di sintassi

Se metto

...last_column_name last_col_datatype) UNIQUE ... 

l'errore è vicino "unico": la sintassi error

+1

:

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

esempio di lavoro UNICO manca una virgola prima che inizi .. – magid

risposta

305

inserire la dichiarazione UNICO all'interno della sezione definizione di colonna:

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

Wow. Potrei ottenere il tuo semplice esempio per funzionare perfettamente. Un esempio più complesso mi ha preso a calci nel sedere. Certo è difficile trovare la parentesi in eccesso quando ne hai una dozzina. Finalmente ho funzionato. Grazie per la risposta concisa. – Justin

+4

Bella risposta +1. Questa sintassi di creazione mi consente di utilizzare il metodo di inserimento regolare e non l'insertWithOnConflict con il flag SQLiteDatabase.CONFLICT_REPLACE? –

+1

Sto usando 'ON CONFLICT IGNORE' (non ho ancora provato la sostituzione) con più di 2 colonne, ma non vedo che rispetti il ​​vincolo univoco, ma aggiunge allegramente i duplicati. – Michael

7

Beh, la sintassi non corrisponde il link che hai incluso, che specifica:

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

Inizialmente l'ho fatto ... non ha funzionato. Ho provato di nuovo nel caso in cui ... ancora non funziona – Rich

+5

Ayman ha la risposta. . . –

+1

Nome CREATE TABLE (colonne def., CONSTRAINT nome_richiesta - Questo è nuovo UNIQUE (nome_colonna1, nome_colonna2) SOSTITUISCONO RISOL.) – Afwas