2010-04-23 27 views
150

Puedo encontrar "gráficos" de sintaxis en este sitio web de SQLite, pero no hay ejemplos y mi código está fallando. Tengo otras tablas con restricciones únicas en una sola columna, pero quiero agregar una restricción a la tabla en dos columnas. Esto es lo que tengo que está causando una excepción SQLiteException con el mensaje "error de sintaxis".Restricción de la tabla de SQLite: única en varias columnas

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

que estoy haciendo esto basado en lo siguiente:

table-constraint

Para ser claros, la documentación en el enlace que he proporcionado CONTSTRAINT name dice que debe venir antes de que mi definición de la restricción.

Sin embargo, algo que puede conducir a la solución es que lo que sigue a las definiciones de columna entre paréntesis es lo que el depurador se queja.

Si pongo

...last_column_name last_col_datatype) CONSTRAINT ... 

el error es cerca de "sometimiento": error de sintaxis

Si pongo

...last_column_name last_col_datatype) UNIQUE ... 

el error es cerca "único": la sintaxis error

+1

:

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

Ejemplo de trabajo ÚNICO falta una coma antes de que comience ... – magid

Respuesta

305

Ponga la declaración única dentro de la sección de definición de columna:

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

Wow. Podría hacer que tu ejemplo simple funcione a la perfección. Un ejemplo más complejo me estaba pateando el trasero. Seguro que es difícil encontrar el paréntesis en exceso cuando tienes una docena de ellos. Finalmente lo tengo funcionando. Gracias por la respuesta concisa. – Justin

+4

Buena respuesta +1. ¿Esto crea la sintaxis me permite usar el método de inserción regular, y no el insertWithOnConflict con el indicador SQLiteDatabase.CONFLICT_REPLACE? –

+1

Estoy usando 'ON CONFLICT IGNORE' (no he intentado reemplazar todavía) con más de 2 columnas, pero no veo que respete la restricción única, solo agrega alegremente los duplicados. – Michael

7

Bueno, la sintaxis no coincide con el enlace que haya incluido, que especifica:

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

Inicialmente hice eso ... no funcionó. Lo intenté de nuevo por si acaso ... todavía no funciona – Rich

+5

Ayman tiene la respuesta. . . –

+1

CREAR nombre de tabla (defs de columna, CONSTRAINT constraint_name - Esto es nuevo UNIQUE (col_name1, col_name2) ON CONFLICT REPLACE) – Afwas

Cuestiones relacionadas