classe di errore TABLE_OR_VIEW_NOT_FOUND
Impossibile trovare la tabella o la vista <relationName>
. Verificare l'ortografia e la correttezza dello schema e del catalogo.
Se il nome non è stato qualificato con uno schema, verificare l'output current_schema() o qualificare il nome con lo schema e il catalogo corretti.
Per tollerare l'errore in caso di rilascio, usare DROP VIEW IF EXISTS o DROP TABLE IF EXISTS.
Parametri
- relationName: nome della relazione specificata (tabella o vista) che non è possibile trovare.
Spiegazione
Le tabelle e le viste persistenti sono costituite da tre parti del nome: <catalog>.<schema>.<relation>
.
Se non si specificano tutte e tre le parti del nome, viene completata in modo implicito usando il catalogo corrente o lo schema corrente.
Questo comportamento è simile al modo in cui la directory di lavoro del file system influisce sui file che è possibile visualizzare, a meno che non si specifichi completamente il percorso.
Le viste temporanee o le espressioni di tabella comuni (CTE) esistono solo all'interno della sessione o della query e non devono mai essere qualificate.
Il motivo più comune per cui non è possibile trovare una tabella o una vista è:
- L'oggetto non esiste semplicemente.
- Il nome dell'oggetto, lo schema o il catalogo è stato digitato in modo errato.
- L'oggetto non si trova nello schema corrente.
- L'utente non ha accesso all'oggetto e pertanto non può vederlo.
Mitigazione
La mitigazione dell'errore dipende dalla causa:
La tabella o la vista, lo schema o il nome del catalogo non sono stati digitati correttamente?
Correggere l'ortografia.
Il nome non è stato completo e il risultato di
VALUES current_schema()
non corrisponde al nome completo della tabella o della vista?Qualificare in modo esplicito con lo
relationName
schema e il catalogo oppure eseguire unUSE SCHEMA
comando per impostare lo schema implicito desiderato.Si è fatto riferimento a una visualizzazione temporanea, ma si trovava in una sessione precedente, scaduta o diversa?
Ricreare la visualizzazione temporanea usando
CREATE TEMPORARY VIEW <relationName> …
o passare all'uso di una visualizzazione permanente.Si è fatto riferimento a un'espressione di tabella comune (CTE), ma non rientra nell'ambito?
Spostare la definizione del CTE nella query più esterna. Si tratta dell'inizio dell'istruzione, pertanto è visibile ovunque all'interno dell'istruzione .
Si vuole eseguire un'istruzione DDL, ad esempio 'DROP TABLE' solo nel caso in cui l'oggetto esista?
Eseguire l'istruzione usando la
IF EXISTS
clausola , ad esempio :DROP TABLE <relationName> IF EXISTS
.Si sa che l'oggetto esiste, ma non è possibile vederlo in
SHOW TABLE
?Contattare l'amministratore per ottenere l'accesso alla tabella concessa. Potrebbe essere necessario includere anche l'accesso allo schema e al catalogo.
Non è chiaro perché non è possibile risolvere la tabella o la vista?
Per una descrizione dettagliata della risoluzione dei nomi, vedere Tabella e risoluzione della vista .
Esempi
-- The table is located in othercat.someschema
> SELECT count(*) FROM t;
[TABLE_OR_VIEW_NOT_FOUND] The table or view `t` cannot be found.
> VALUES current_schema();
default
-- Change the current schema
> USE SCHEMA othercat.someschema;
> SELECT count(*) FROM T;
1
-- Alternatively qualify the table
> SELECT count(*) FROM othercat.someschema.t;
1
-- A reference to a CTE in the wrong scope:
> SELECT count(1) FROM (WITH v(c1) AS (VALUES (1)) VALUES(2)) AS t(c1), v;
[TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.
-- Move the CTE to top level
> WITH v(c1) AS (VALUES (1))
SELECT count(1) FROM VALUES(2) AS t(c1), v;
1
-- Dropping a non existing view
> DROP VIEW v;
[TABLE_OR_VIEW_NOT_FOUND] The table or view `v` cannot be found.
> DROP VIEW IF EXISTS v;