Meilleure réponse
Tout comme votre adresse personnelle identifie de manière unique votre lieu de résidence, un Oracle ROWID identifie de manière unique lemplacement dune ligne sur le disque. Les informations contenues dans un ROWID donnent à Oracle tout ce dont il a besoin pour trouver votre ligne, le numéro de disque, le cylindre, le bloc et le décalage dans le bloc.
Valeurs Rowid ont plusieurs utilisations importantes:
- Ils sont le moyen le plus rapide daccéder à une seule ligne.
- Ils peuvent vous montrer comment les lignes dune table sont stockées.
- Ce sont des identifiants uniques pour les lignes dune table.
Vous ne devez pas utiliser Rowid comme clé primaire dune table. Si vous supprimez et réinsérez une ligne avec les utilitaires dimportation et dexportation, par exemple, son id de ligne peut changer. Si vous supprimez une ligne, Oracle peut réattribuer son rowid à une nouvelle ligne insérée ultérieurement.
Bien que vous puissiez utiliser la pseudocolonne Rowid dans le Select et Où clause dune requête, ces valeurs de pseudocolonne ne sont pas réellement stockées dans la base de données. Vous ne pouvez pas insérer, mettre à jour ou supprimer une valeur de la pseudo-colonne Rowid.
Réponse
ROWID est lemplacement physique dune ligne. Supposons que vous ayez une table sans clé primaire. donc cette table peut avoir des lignes en double. Comment supprimeriez-vous les lignes en double tout en gardant exactement une de ce type?
Oracle fournit ROWID comme une sorte de substitut à la clé primaire. Vous pouvez écrire une requête imbriquée de type corrélé [(grouper par toutes les colonnes de la ligne et prendre MIN (ROWID) dans chaque groupe dans la requête interne, pour chaque groupe, supprimer les autres lignes du groupe dans la requête externe)] ..
par exemple:
SQL> select * from employees;
SSN NAME
---------- ----------
1 john
1 john
2 john
2 john
10 sam
11 beth
11 beth
12 beth
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 john
2 john
2 john
10 sam
11 beth
12 beth
6 rows selected.