Pregunta

¿Cuál es la sintaxis para especificar una clave principal en más de 1 columna en SQLITE?

¿Fue útil?

Otros consejos

CREATE TABLE something (
  column1 INTEGER NOT NULL,
  column2 INTEGER NOT NULL,
  value,
  PRIMARY KEY ( column1, column2)
);

Sí. Pero recuerda que dicha clave primaria permite valores NULL en ambas columnas múltiples veces.

Crear una tabla como tal:

    sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));

Ahora bien, esto funciona sin ningún tipo de advertencia siguiente:

sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> insert into something (value) VALUES ('bla-bla');
sqlite> select * from something;
NULL|NULL|bla-bla
NULL|NULL|bla-bla

básica:

CREATE TABLE table1 (
    columnA INTEGER NOT NULL,
    columnB INTEGER NOT NULL,
    PRIMARY KEY (columnA, columnB)
);

Si sus columnas son las claves externas de otras tablas (caso común):

CREATE TABLE table1 (
    table2_id INTEGER NOT NULL,
    table3_id INTEGER NOT NULL,
    FOREIGN KEY (table2_id) REFERENCES table2(id),
    FOREIGN KEY (table3_id) REFERENCES table3(id),
    PRIMARY KEY (table2_id, table3_id)
);

CREATE TABLE table2 (
    id INTEGER NOT NULL,
    PRIMARY KEY id
);

CREATE TABLE table3 (
    id INTEGER NOT NULL,
    PRIMARY KEY id
);

Los campos de clave primaria deben ser declarados como no nulo (esto es no estándar como la definición de una clave principal es que debe ser único y no nulo). Pero a continuación es una buena práctica para todas las claves principales de varias columnas en cualquier DBMS.

create table foo
(
  fooint integer not null
  ,foobar string not null
  ,fooval real
  ,primary key (fooint, foobar)
)
;

Desde la versión 3.8.2 de SQLite, una alternativa a especificaciones no explícito NULL es la especificación "SIN ROWID": [ 1 ]

NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.

"SIN ROWID" tablas tienen potenciales ventajas de eficiencia, por lo que una alternativa menos detallado a considerar es:

CREATE TABLE t (
  c1, 
  c2, 
  c3, 
  PRIMARY KEY (c1, c2)
 ) WITHOUT ROWID;

Por ejemplo, en el símbolo del sqlite3: sqlite> insert into t values(1,null,3); Error: NOT NULL constraint failed: t.c2

En otra forma, también puede hacer que el dos clave principal columna unique y el autoincrementación primary clave. Al igual que este: https://stackoverflow.com/a/6157337

El siguiente código crea una tabla con la columna 2 como clave principal en SQLite.

SOLUCIÓN:

CREATE TABLE IF NOT EXISTS users (id TEXT NOT NULL, name TEXT NOT NULL, pet_name TEXT, PRIMARY KEY (id, name))

PRIMARY KEY (id, name) no funcionó para mí. La adición de una restricción hizo el trabajo para mí.

CREATE TABLE IF NOT EXISTS customer (id INTEGER, name TEXT, user INTEGER, CONSTRAINT PK_CUSTOMER PRIMARY KEY (user, id))

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top