Come faccio a sapere se un indice SQLite è univoco? (Con SQL)
-
03-07-2019 - |
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.
Soluzione
PRAGMA INDEX_LIST('table_name');
Restituisce una tabella con 3 colonne:
-
seq
ID numerico univoco dell'indice -
name
Nome dell'indice -
unico
Flag di unicità (diverso da zero seUNIQUE
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à.