Domanda

La mia comprensione è che il ROWID è un valore univoco per ogni riga del risultato restituito da una query.

Perché abbiamo bisogno di questo ROWID? C'è già il ROWNUM in Oracle.

Avere qualsiasi ROWID utilizzato in una query SQL?

È stato utile?

Soluzione

ROWID è la posizione fisica di una riga. Di conseguenza, è il modo più veloce di localizzare una riga, veloce anche di una ricerca della chiave primaria. Così può essere utile in alcuni tipi di transazione in cui selezioniamo alcune righe, memorizzare i loro ROWIDs e quindi utilizzare in seguito i ROWIDs a clausole where per DML contro quelle stesse righe.

The Oracle SELECT ... FOR UPDATE sintassi utilizza implicitamente ROWID, quando abbiamo aggiornare la riga bloccata usando DI WHERE CURRENT. Anche la tabella ECCEZIONI (riferimento nell'applicare vincoli con le eccezioni IN clausola) viene ROW_ID colonna. Questo ci permette di identificare rapidamente le righe che stanno rompendo il nostro vincolo.

quest'ultima esempio punta ad un'altra uso generale: quando stiamo scrivendo qualche pezzo generico di codice e bisogno di un meccanismo per la memorizzazione UID senza preoccupazioni riguardanti il ??tipo di dati, chiavi composte, ecc

ROWNUM invece è uno pseudo-colonna che etichetta una riga in un dato insieme risultato. Essa non ha alcun significato permanente.

modifica

Il ROWID per un dato record può cambiare nel corso della vita di un sistema, ad esempio attraverso un tavolo di ricostruire. Anche se un record viene eliminato un nuovo record potrebbe essere dato che ROWID. Conseguentemente ROWIDs non sono adatti per l'uso come UID a lungo termine. Ma sono abbastanza buono per l'utilizzo all'interno di una transazione.

Altri suggerimenti

Ora so un esempio di questo.

si supponga di avere tabella senza chiavi primarie. quindi questa tabella può avere le righe duplicate. Come si eliminare le righe duplicate ma mantenere esattamente uno di quel tipo?

Oracle fornisce ROWID come una sorta di sostituto per la chiave primaria. È possibile scrivere una query nidificata che è di tipo correlata [(gruppo da tutte le colonne nella riga e prendere MIN (ROWID) in ciascun gruppo di query interna, per ciascun gruppo eliminare altre righe nel gruppo in outerquery)]

Esempio

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        11 null
        12 null

8 rows selected.

SQL> delete from employees where ROWID NOT IN (select min(ROWID) from employees
group by ssn,name);

2 rows deleted.

SQL> select * from employees;

       SSN NAME
---------- ----------
         1 helen
         2 helen
         2 peter
        10 sally
        11 null
        12 null

6 rows selected.

Si noti che ROWID non persistono in un'esportazione del database e del ciclo IMPORT. Non si dovrebbe mai memorizzare un identificativo nelle tabelle come valore chiave.

ROWID identifica univocamente una riga in una tabella. ROWNUM ti dà il numero di riga di un risultato per una query specifica. I due sono molto diversi e non sono intercambiabili.

Inoltre v'è ROW_NUMBER che è una versione più moderna di ROWNUM, e si comporta in modo leggermente diverso. Scopri questo articolo che spiega la differenza.

Un ROWID è costituito da (ma non necessariamente in questo ordine, anche se la parte ROWNUM è l'ultima parte di ROWID per quanto mi ricordo):

  • OBJID L'identificatore univoco dell'oggetto.
  • Fileno Il numero relativo del file di dati in tabelle.
  • il BLOCKNO Il numero relativo blocco nel file di dati dopo il fileheader.
  • il ROWNUM Il rownum relativa all'interno del blocco.

Si può facilmente abbattere il ROWID in esso di campi compositi (OBJID, Fileno, BLOCKNO, ROWNUM) utilizzando il ROWIDTOCHAR () SQL-funzione, o l'uso:

    SQL> select DBMS_ROWID.ROWID_OBJECT(rowid) "OBJECT",
    2         DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) "FILE",
    3         DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) "BLOCK",
    4         DBMS_ROWID.ROWID_ROW_NUMBER(rowid) "ROW"
    5  from dual
    6  /
        OBJECT       FILE      BLOCK        ROW
    ---------- ---------- ---------- ----------
           258          1       2082          0

Si noti che il ROWNUM campo (o ROW nella query precedente) è non stesso ROWNUM come SQL ROWNUM pseudo colonna si utilizza in query SELECT, che è solo il rownumber generato dinamicamente della riga nel set di risultati.

Si noti che a causa di questa implementazione, righe, blocchi, estensioni e segmenti non sono trasportabili senza rompere il ROWID, che invalida indici.

Il ROWID è il percorso di accesso diretto più al blocco in cui risiede riga e univoco identifica la riga, in quanto codifica il file unico e unico blocco all'interno del file e riga univoco all'interno del blocco.

Più informazioni:

Vedi: DBMS note sul formato ROWID

Nota:

Se avete un po 'di comprensione dei file di database strutture oracolo modo e blocchi, e sapere alcuni di programmazione C, si potrebbe facilmente fare un programma che visualizza il contenuto del blocco specificato ROWID (un 8k, o qualsiasi altra cosa dimensione del blocco viene utilizzato nel database, blocco che parte da fileheadersize + BLOCKNO * BLOCK_SIZE. il blocco contiene l'intestazione del blocco e successivamente (assumendo la tabella non cluster) il rowdir, che per ogni riga dà l'offset all'interno del blocco per ogni riga relativa. così, per esempio in posizione 0 nel rowdir è l'offset di 0-esima riga all'interno del blocco relativa, nella posizione 1 nella rowdir la posizione relativa della riga 1-st, ecc il numero di righe stessa vengono trattenuti nella l'intestazione del blocco (vedere la documentazione orale sul layout blocco).

Con un po 'di conoscenze di programmazione e di guardare la documentazione sulla base di dati Oracle Files un blocchi per l'esatta disposizione dei blocchi, si può vedere come le righe vengono memorizzati su disco, e anche di ricostruire tutti i valori i negozi di riga per ogni colonna . Ogni riga contiene metadati per la lunghezza della riga e il numero di colonne, e per ogni colonna, un'indicazione per il tipo della colonna e la bytesize e successivo di valore. Bytesize 0 significa che i dati della colonna è vuota (o: NULL).

ROWID permette in sostanza di avere due file con gli stessi dati esatti. Mentre, in genere si desidera la chiave primaria per essere un po 'più significativo di un RowID, è solo un modo semplice per garantire automaticamente unicità tra le righe.

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