¿Cuál es la sintaxis para especificar una clave primaria en más de 1 columna en SQLITE?
¿Cuál es la sintaxis para especificar una clave primaria en más de 1 columna en SQLITE?
Respuestas:
De acuerdo con la documentación , es
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY ( column1, column2)
);
NULL
está permitido en claves primarias. Esta respuesta enfatiza que si desea un comportamiento más estándar, debe agregarlo NOT NULL
usted mismo. Mi respuesta es solo la sintaxis muy básica para una clave primaria de varias columnas.
Si. Pero recuerde que dicha clave primaria permite NULL
valores en ambas columnas varias veces.
Crea una tabla como tal:
sqlite> CREATE TABLE something (
column1, column2, value, PRIMARY KEY (column1, column2));
Ahora esto funciona sin previo aviso:
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
NULL
?
Básico :
CREATE TABLE table1 (
columnA INTEGER NOT NULL,
columnB INTEGER NOT NULL,
PRIMARY KEY (columnA, columnB)
);
Si sus columnas son claves foráneas 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 declararse como no nulos (esto no es estándar ya que la definición de una clave primaria es que debe ser única y no nula). Pero a continuación se muestra una buena práctica para todas las claves primarias 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 las especificaciones explícitas NOT NULL es la especificación "SIN ROWID": [ 1 ]
NOT NULL is enforced on every column of the PRIMARY KEY
in a WITHOUT ROWID table.
Las tablas "SIN ROWID" tienen ventajas potenciales de eficiencia, por lo que una alternativa menos detallada a considerar es:
CREATE TABLE t (
c1,
c2,
c3,
PRIMARY KEY (c1, c2)
) WITHOUT ROWID;
Por ejemplo, en el indicador sqlite3:
sqlite> insert into t values(1,null,3);
Error: NOT NULL constraint failed: t.c2
WITHOUT ROWID
tiene implicaciones adicionales, y no debe usarse como una alternativa a escribir NOT NULL
junto a su clave principal.
De otra manera, también puede hacer que la clave principal de dos columnas unique
y la clave de incremento automáticoprimary
. Justo así: https://stackoverflow.com/a/6157337
El siguiente código crea una tabla con 2 columnas 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))