6 votos

¿Se requiere un PK para las capas vectoriales GeoPackage?

De acuerdo a geopackage.org's "introducción a la GeoPackage" guía de características se almacenan en definido por el usuario los datos de las tablas. Es que parece que dice que estas tablas requieren una clave primaria:

Aparte de la geometría de la columna y una clave principal, el esquema de una tabla características es el ejecutor.

(El énfasis es mío)

Es que un duro requisito? El subyacente SQLite, probablemente, no requiere de una clave principal, pero no la GeoPackage especificación de mandato de cada capa para tener uno?


Motivación:

Estoy preguntando, porque QGIS 3.4.4 parece manejar esto de manera incoherente. Si se cruzan dos capas de vector de la capa resultante a menudo no tienen ningún atributos únicos (a excepción quizá de la geometría de la columna si las capas de entrada se topológica).

  • Si me intenta almacenar el resultado directamente a un GeoPackage capa, características que daría lugar a infracciones de restricción ÚNICA en la fid columna (que corresponde a la fid de la primera capa de entrada y, al parecer, automáticamente elegido como el nuevo GeoPackage de la capa de PK) son simplemente omite, el giro de la capa resultante incompleta.
  • Si me almacenar el resultado en una "capa temporal", el resultado es completo. fid de la primera capa de entrada se convierte en fid columna de la capa temporal y fid de la segunda capa de entrada se convierte en fid_2no.
    • Si yo ingenuamente tratar de conservar en un GeoPackage de la capa de uso "de forma permanente", que se genera debido a UNIQUE infracciones de restricción.
    • Si yo uso "de forma permanente", pero en el cuadro de diálogo quitar fid de la "FID" campo, que se puede guardar en un GeoPackage capa fina. (Y la carga de se confirma que todas las características están todavía allí y de que no hay nuevos columna única para un PK ha sido añadido.)
  • Si me pongo de una capa cargada de una GeoPackage que, al parecer, tiene un PK de campo ( fid ha "not Null" y "Único" marcada como restricciones en las propiedades de Capa > forma de Atributo) y en quitar el fid de campo en las propiedades de Capa > Campos de Origen, de QGIS se niega a guardar la capa que cuando tratando de dejar "modo de edición" para esa capa.

(No etiquetado con , , etc., como la pregunta en sí misma es sobre el formato de archivo y debe ser independiente de lo que el Software está siendo utilizado).

6voto

Joe Puntos 16

Cada tabla de la característica en GeoPackage debe tener una clave primaria de tipo INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL. Consulte la sección 2.1.6 en la norma o de esta parte en la introducción del documento http://www.geopackage.org/guidance/getting-started.html#features

Definidos por el usuario los Datos de las Tablas

Características se almacenan en los datos definidos por el usuario tablas. Cada una de las características de la tabla tiene exactamente una geometría de la columna, un BLOB. (La estructura de esta nota se describe aquí.) El OGC Simple Características tipos de geometría son compatibles tipos de geometría. Otros que la geometría de la columna y una clave principal, el esquema de una tabla características de es hasta el implementador. Propiedades (texto, entero o real) proporcionar información adicional acerca de cada función. El GeoPackage estándar un ejemplo de esquema.

La interfaz de usuario de QGIS hizo creer que se creó una tabla sin clave principal al texto eliminado fid de la "FID" campo en el cuadro de diálogo. Sin embargo, incluso si usted no hace que la tabla se creará con una clave principal, pero el PK campo simplemente no tienen nombre. Usted puede ver todo el CREATE TABLE sentense de las tablas internas de SQLITE con una consulta

SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'test_table'

El resultado es como este:

CREATE TABLE "test_table" ( "" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
"geom" MULTISURFACE, "ogr_pkid" TEXT(255), "id" TEXT(255));

QGIS se crea la tabla en este, de manera que la parte obligatoria "INTEGER PRIMARY KEY AUTOINCREMENT not NULL" se encuentra en el esquema de la tabla como GeoPackage estándar requiere. Sin embargo, SQLite crea PK campo, en cualquier caso, si un usuario no denegarla. Internamente SQLite sabe que el campo como ROWID https://www.sqlite.org/rowidtable.html.

QGIS no muestra el ROWID campo que realmente existe para el motor de SQLite. Por lo tanto, podría ser mejor si usted no deje que el nombre de la FID campo vacío, pero le dan un alias como "foo" o "fid2". A continuación, se creará la tabla como CREATE TABLE "test_table" ( "foo" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,... y "foo" campo será visible en QGIS.

3voto

ghshtalt Puntos 1052

Ver GeoPackage Estándar De Codificación De La Sección 2.1.6. Requisito de 29 de decir que no debe ser explícito de la clave primaria. Los clientes deben apoyar las vistas que puede tener una clave principal. Pero si lo hace, el comando SQLVACÍO puede cambiar la clave de los valores de sus características.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X