Pregunta

Quiero averiguar, con una consulta SQL, si un índice es ÚNICO o no. Estoy usando SQLite 3.

He intentado dos enfoques:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

Esto devuelve información sobre el índice (" tipo ", " nombre " ;, " tbl_name " ;, " rootpage " y " sql "). Tenga en cuenta que la columna SQL está vacía cuando SQLite crea automáticamente el índice.

PRAGMA index_info(sqlite_autoindex_user_1);

Esto devuelve las columnas en el índice (" seqno " ;, " cid " y " nombre ").

¿Alguna otra sugerencia?

Editar: El ejemplo anterior es para un índice generado automáticamente, pero mi pregunta es sobre los índices en general. Por ejemplo, puedo crear un índice con " CREATE UNIQUE INDEX index1 ON visit (usuario, fecha) " ;. Parece que ningún comando SQL mostrará si mi nuevo índice es ÚNICO o no.

¿Fue útil?

Solución

PRAGMA INDEX_LIST('table_name');

Devuelve una tabla con 3 columnas:

  1. seq ID numérico único del índice
  2. name Nombre del índice
  3. unique Bandera de exclusividad (distinto de cero si UNIQUE index).

Luego, recorra las filas resultantes hasta que vea el nombre del índice que desea consultar (desafortunadamente, no puede tener una cláusula WHERE> en una declaración de PRAGMA .)

Otros consejos

Dado que nadie ha encontrado una buena respuesta, creo que la mejor solución es esta:

  • Si el índice comienza con " sqlite_autoindex " ;, es un índice generado automáticamente para una sola columna ÚNICA
  • De lo contrario, busque la palabra clave UNIQUE en la columna sql en la tabla sqlite_master, con algo como esto:

    SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE '% UNIQUE%'

puede generar mediante programación una declaración de selección para ver si alguna tupla apunta a más de una fila. Si recuperas tres columnas, foo, bar y baz, crea la siguiente consulta

select count(*) from t
group by foo, bar, baz
having count(*) > 1

Si eso devuelve alguna fila, su índice no es único, ya que más de una fila se asigna a la tupla dada. Si sqlite3 es compatible con tablas derivadas (aún no tengo la necesidad, por lo que no sé de antemano), puede hacer que esto sea aún más breve:

select count(*) from (
    select count(*) from t
    group by foo, bar, baz
    having count(*) > 1
)

Esto devolverá un conjunto de resultados de una sola fila, denotando el número de conjuntos de tuplas duplicados. Si es positivo, su índice no es único.

Estás cerca:

1) Si el índice comienza con " sqlite_autoindex " , es un índice generado automáticamente para la clave principal. Sin embargo, esto estará en las tablas sqlite_master o sqlite_temp_master dependiendo de si la tabla que se está indexando es temporal.

2) Debe vigilar los nombres de las tablas y las columnas que contienen la subcadena unique , por lo que desea utilizar:

SELECT * FROM sqlite_master WHERE type = 'index' AND sql LIKE 'CREATE UNIQUE INDEX%'

Consulte la documentación del sitio web de sqlite en Crear índice

A partir de sqlite 3.16.0 también puede usar las funciones pragma:

SELECT distinct il.name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

La declaración anterior mostrará todos los nombres de índices únicos.

SELECT DISTINCT m.name as table_name, ii.name as column_name
  FROM sqlite_master AS m,
       pragma_index_list(m.name) AS il,
       pragma_index_info(il.name) AS ii
 WHERE m.type='table' AND il.[unique] = 1;

La declaración anterior devolverá todas las tablas y sus columnas si la columna forma parte de un índice único.

De la docs :

  

Las funciones con valores de tabla para la característica PRAGMA se agregaron en SQLite versión 3.16.0 (2017-01-02). Las versiones anteriores de SQLite no pueden usar esta característica.

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