Domanda

Voglio scoprire, con una query SQL, se un indice è UNICO o meno. Sto usando SQLite 3.

Ho provato due approcci:

SELECT * FROM sqlite_master WHERE name = 'sqlite_autoindex_user_1'

Restituisce informazioni sull'indice ("tipo", "nome", "nome nome", "pagina principale" e "sql"). Si noti che la colonna sql è vuota quando l'indice viene creato automaticamente da SQLite.

PRAGMA index_info(sqlite_autoindex_user_1);

Questo restituisce le colonne nell'indice (" seqno " ;, " cid " e " name ").

Altri suggerimenti?

Modifica: L'esempio sopra è per un indice generato automaticamente, ma la mia domanda riguarda gli indici in generale. Ad esempio, posso creare un indice con " CREATE UNIQUE INDEX index1 ON visit (utente, data) " ;. Sembra che nessun comando SQL mostrerà se il mio nuovo indice è UNICO o meno.

È stato utile?

Soluzione

PRAGMA INDEX_LIST('table_name');

Restituisce una tabella con 3 colonne:

  1. seq ID numerico univoco dell'indice
  2. name Nome dell'indice
  3. unico Flag di unicità (diverso da zero se UNIQUE index.)

Quindi basta scorrere le righe risultanti fino a quando non viene visualizzato il nome dell'indice che si desidera interrogare (purtroppo non è possibile avere una clausola WHERE in un'istruzione PRAGMA .)

Altri suggerimenti

Dato che nessuno ha trovato una buona risposta, penso che la soluzione migliore sia questa:

  • Se l'indice inizia con " sqlite_autoindex " ;, si tratta di un indice generato automaticamente per una singola colonna UNIQUE
  • Altrimenti, cerca la parola chiave UNIQUE nella colonna sql nella tabella sqlite_master, con qualcosa del genere:

    SELEZIONA * DA sqlite_master DOVE type = 'index' E sql LIKE '% UNIQUE%'

puoi creare a livello di codice un'istruzione select per vedere se qualche tupla punta a più di una riga. Se torni a tre colonne, pippo, bar e baz, crea la seguente query

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

Se restituisce una riga, l'indice non è univoco, poiché più di una riga viene mappata sulla tupla data. Se sqlite3 supporta le tabelle derivate (devo ancora averne bisogno, quindi non lo so off-hand), puoi renderlo ancora più conciso:

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

Questo restituirà un set di risultati a riga singola, che indica il numero di set di tuple duplicati. Se positivo, il tuo indice non è unico.

Sei vicino:

1) Se l'indice inizia con " sqlite_autoindex " , si tratta di un indice generato automaticamente per la chiave primaria. Tuttavia, ciò si troverà nelle tabelle sqlite_master o sqlite_temp_master a seconda che la tabella indicizzata sia temporanea.

2) È necessario fare attenzione ai nomi delle tabelle e alle colonne che contengono la sottostringa univoco , quindi si desidera utilizzare:

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

Consulta la documentazione del sito Web sqlite su Crea indice

A partire da sqlite 3.16.0 è possibile utilizzare anche le funzioni 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;

L'istruzione precedente elenca tutti i nomi di indici univoci.

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;

L'istruzione precedente restituirà tutte le tabelle e le relative colonne se la colonna fa parte di un indice univoco.

Dai documenti :

  

Le funzioni con valori di tabella per la funzione PRAGMA sono state aggiunte in SQLite versione 3.16.0 (2017-01-02). Le versioni precedenti di SQLite non possono utilizzare questa funzionalità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top