2011-05-27 13 views
15

tengo varias claves primarias (compuesto) en una mesa y una de ellas será de incremento automático. Sin embargo, curiosamente SQLite permite el uso de la palabra clave AUTOINCREMENT justo después de una palabra clave PRIMARY KEY obligatoria.SQLite clave multi-primaria en una tabla, una de ellas es Incremento automático

Mi consulta es:

CREATE TABLE ticket (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    seat TEXT, payment INTEGER, 
    PRIMARY KEY (id, seat)) 

Sin embargo, el error es table "ticket" has more than one primary key.

En realidad puedo evitar otras claves principales para esta tabla. Pero estoy codificando un marco ORM (demonios, sí, estoy loco) y no quiero cambiar la estructura de la generación de restricciones PRIMARY KEY para una tabla (porque está permitido en MySQL afaik).

¿Conoce alguna solución?

+0

Creo que quería decir "sólo" después en lugar de "sólo" después? – Michael

Respuesta

12

No, no creo que esto es posible.

Se puede crear un UNIQUE INDEX que tiene esencialmente el mismo efecto que una clave principal:

CREATE UNIQUE INDEX pk_index ON "table1"("field1","field2"); 

Además, no veo la lógica de su esquema, que es -> si una columna es incrementado automáticamente y usted No pretendo interferir con los valores de forma manual, será único de todos modos, por lo que es una buena clave primaria corta simple. ¿Por qué el compuesto? Sin embargo, puede tener buenas razones para hacer otro índice en la combinación de columnas.

+0

Digamos que tengo una clave principal en una tabla, ¿debo generar un índice para esta clave primaria o se genera internamente? –

+0

Sí, la clave es automáticamente un índice. Ver este [texto corto] (http://developer.mimer.com/documentation/html_92/Mimer_SQL_Engine_DocSet/Basic_concepts4.html) sobre por qué esto es así. – stefgosselin

+0

+1 para el bit de autoincrement. De hecho, si es autoincremento, no necesita tener otro campo etiquetado en la clave principal. – MPelletier

18

UNIQUE INDEX sola no tiene el mismo efecto que PRIMARY KEY. Un índice único permitirá un NULL; una restricción de clave primaria no lo hará. Será mejor que declares esas dos limitaciones.

CREATE TABLE ticket (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    seat TEXT NOT NULL, 
    payment INTEGER, 
    UNIQUE (id, seat)); 

También debería pensar detenidamente si realmente necesita aceptar pagos NULL.

+0

mejor solución solucionó mi problema –

0

También puede escribir así:

CREATE TABLE ticket (
    id INTEGER PRIMARY, 
    seat TEXT, payment INTEGER, 
    PRIMARY KEY (id, seat)) 
+1

Esta técnica no funcionó y, por lo tanto, la he votado negativamente. –

+1

no responde la pregunta, el campo 'id' no se incrementa automáticamente –

Cuestiones relacionadas