¿Cuál es la sintaxis para especificar una clave principal en más de 1 columna en SQLITE?Clave principal Sqlite en varias columnas
Respuesta
De acuerdo con la documentation, es
CREATE TABLE something (
column1,
column2,
column3,
PRIMARY KEY (column1, column2)
);
Bueno, esto es correcto, pero de acuerdo con la documentación, CREA TABLA algo (columna1 PRIMARY KEY, column2 PRIMARY KEY); debería ser posible también, pero no lo es. – Yar
@Yar Los documentos dicen "Si hay más de una cláusula PRIMARY KEY en una sola instrucción CREATE TABLE, es un error". Sí, los diagramas del ferrocarril pueden indicar que también es válido, pero el texto a continuación aclara que no es así. –
Recuerde agregar la parte * PRIMARY KEY (column1, column2) * al final como en esta respuesta. Si intenta agregarlo después de la definición de la columna 2 obtendrá un ** error de sintaxis **. – vovahost
Sí. Pero recuerde que dicha clave primaria permite valores NULL
en ambas columnas varias 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:
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
¿Hay alguna referencia a la razón de tal comportamiento? ¿Cuál sería una buena manera de volcar varias filas en la base de datos y aún eliminar duplicados, incluso si contienen 'NULL'? – Pastafarianist
@Pastafarianist http://www.sqlite.org/lang_createtable.html - "De acuerdo con el estándar SQL, PRIMARY KEY siempre debe implicar NOT NULL.Desafortunadamente, debido a un error en algunas versiones anteriores, este no es el caso en SQLite. [...] Los valores NULL se consideran distintos de todos los demás valores, incluidos otros NULL. " –
Sí, en SQL NULL siempre se compara falso. Debido a esto, la teoría relacional específicamente excluye NULL como el valor de cualquier componente clave. , es práctica relacional.Parece que los autores optaron por permitir pragmáticamente las claves múltiples pero no "iguales." Claramente, es preferible no permitir NULL como valores clave. – holdenweb
CREATE TABLE something (
column1 INTEGER NOT NULL,
column2 INTEGER NOT NULL,
value,
PRIMARY KEY (column1, column2)
);
¿La clave principal no impone un NOT NULL? – pratnala
@pratnala En SQL estándar Sí. En SQLite, 'NULL' está permitido en las claves primarias. Esta respuesta enfatiza que si desea un comportamiento más estándar, debe agregar' NOT NULL' usted mismo. Mi respuesta es simplemente la sintaxis básica para una columna múltiple Clave primaria. –
campos de clave primaria deben ser declarados como no nulo (esto es no estándar como el la definición de una clave primaria es que debe ser única y no nula). Pero a continuación es una buena práctica para todas las claves primarias de múltiples 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 NO 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
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
);
De otra manera, también puede convertir la tecla dos columnas primariaunique
y autoincremento clave primary
. Al igual que esto: https://stackoverflow.com/a/6157337
- 1. SQLite: GROUP_CONCAT() varias columnas
- 2. Clave principal de dos columnas en MySQL
- 3. Adición de clave externa en varias columnas
- 4. ¿Se necesita un índice para una clave principal en SQLite?
- 5. Restablecimiento de SQLite Campo de clave principal
- 6. Actualización de clave duplicada - Varias columnas
- 7. Valor NULL en clave primaria de varias columnas
- 8. Diferencia en el rendimiento del servidor SQL con la clave principal de una o varias columnas?
- 9. ¿La creación de una clave principal en varias columnas genera índices para todas ellas?
- 10. Restricción de la tabla de SQLite: única en varias columnas
- 11. sqlalchemy ORM: cómo declarar una clase de tabla que contiene una clave principal de varias columnas?
- 12. MySQL clave principal de multicolumna
- 13. h2 sql, crear tabla con clave primaria de varias columnas?
- 14. Definir una clave principal única basada en 2 columnas
- 15. Clave principal de múltiples columnas en MySQL 5
- 16. Cómo crear una clave compuesta en varias columnas
- 17. Tablas sin clave principal
- 18. ¿Por qué no puede usar SQLite ROWID como clave principal?
- 19. DISTINCT en varias columnas
- 20. join en varias columnas
- 21. Cambio de clave principal
- 22. Dividir varias columnas en varias filas
- 23. SQL dividir varias columnas en varias filas
- 24. clave externa que hace referencia una clave principal 2 columnas en SQL Server
- 25. TSQL - ISNULL en varias columnas
- 26. Usando acts_as_list en varias columnas
- 27. Restricción única en varias columnas
- 28. Actualizar varias columnas en SQL
- 29. LINQ COUNT en varias columnas
- 30. RestKit atributo de clave principal
Esto también se denomina clave compuesta http://en.wikipedia.org/wiki/Compound_key – OneWorld
@OneWorld O clave compuesta, si alguna de las columnas no es una clave en sí misma. – Michael