Domanda

Quando creo una vista che sto praticamente facendo una nuova tabella che verrà automaticamente scambiati su quando i dati in una delle tabelle si unisce modifiche; è corretto?

Anche perché non posso utilizzare subquery a mio avviso?

È stato utile?

Soluzione

Una vista opere come una tabella , ma non è un tavolo. E non esiste mai; è solo un'istruzione SQL preparata che viene eseguito quando si fa riferimento il nome della vista. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

... è equivalente a correre:

SELECT x.* 
  FROM (SELECT * FROM bar) x

Un mysqldump non potrà mai contenere le righe da inserire in una visione ...

  

Anche perché non posso utilizzare subquery a mio avviso ????

Questo, purtroppo, è di (anche se discutibile) di progettazione. Ci sono numerose limitazioni per le viste di MySQL, che sono documentati: http: // dev.mysql.com/doc/refman/5.0/en/create-view.html

Quindi, se è solo una tabella immaginaria / preparato dichiarazione Vuol dire che ha teoricamente le stesse prestazioni (o anche meno) come un normale tavolo / ricerca?


No.
Una tabella può avere indici associati, che possono rendere più veloce reperimento dei dati (ad un certo costo per inserimento / aggiornamento). Alcuni database supportano "materializzate" viste, che sono viste che possono avere indici applicati a loro - che non dovrebbe essere una sorpresa che MySQL non supporta data la funzionalità di visione limitata (che ha avuto inizio solo nel v5 IIRC, molto in ritardo al gioco).

A causa di una vista è una tabella derivata, le prestazioni della vista è solo buono come la query è costruito su. Se quella query fa schifo, il problema di prestazioni sarà solo palle di neve ... Detto questo, quando si interroga una vista - se un riferimento di vista colonna nella clausola WHERE non è avvolto in una funzione (IE: WHERE v.column LIKE ..., non WHERE LOWER(t.column) LIKE ...), l'ottimizzatore può spingere i criteri (chiamato un predicato) sulla query originale - rendendo più veloce

.

Altri suggerimenti

mi sono imbattuto nello stesso problema anche (con mia grande sorpresa, perché la mia ricerca sembra indicare che Oracle e MS lo supportano).

I aggirare questa limitazione (almeno per ora, fino a prova non utilizzabile) con la creazione di due ulteriori viste per il mio punto di vista finale.

Esempio:

CREATE VIEW Foo1 AS
    SELECT * FROM t ORDER BY ID, InsertDate DESC

CREATE VIEW Foo2 AS
    SELECT * FROM Foo1 GROUP BY ID

CREATE VIEW Foo AS
    SELECT * FROM Foo2 ORDER BY ID

L'esempio sopra ha fondamentalmente un tavolo 't' che è una tabella temporale contenente tutte le revisioni. Il mio 'Foo' (vista) è fondamentalmente una vista semplice di soli miei maggior parte con la versione attuale di ciascun record. Sembra funzionare bene per ora!

Aggiornamento:

Non so se questo è un altro bug in MySQL 5.1, ma l'esempio di cui sopra non nel lavoro fatto! Le opere 'foo1' come previsto, ma il 'foo2' sembra ignorare l'ordine prima del raggruppamento quindi il mio risultato finale non è quello che è destinato. Ho anche ottenere lo stesso risultato se cambio la 'DESC' per 'ASC' (sorprendentemente).

Inoltre, se leggete la 17.5.1. Vedi Sintassi , si afferma chiaramente:

  

"Una vista può essere creato da molti tipi di istruzioni SELECT. Si può fare riferimento a tabelle di base o ad altri punti di vista. E 'possibile utilizzare unisce, UNION, e subquery."

ho intenzione di aggiornare il mio database per 5.6 e provare di nuovo!

La differenza è:

per vista che si può avere solo subquery in cui - parte, non nel da - parte così un

CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar) 

avrebbe funzionato - ma allo stesso tempo si ottiene una vista in sola lettura ... Un semplice vista su una singola tabella permetterebbe di aggiornamento "attraverso" la vista alla tabella sottostante

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