Problema eliminării duplicatelor în tabelele cu oracolă este totul despre ea și despre programare

Puteți elimina astfel de duplicate cu o singură instrucțiune SQL:

Nu vom continua să ne ocupăm de această problemă, deoarece acest aspect nu este subiectul acestui articol deloc. În plus, subiectul articolului nu este nici chiar căutarea duplicatelor.

Problema noastră este eliminarea înregistrărilor duplicate, care sunt menționate din alte tabele. Liniile repetate sunt cunoscute în prealabil.

Foarte des, utilizatorii nu sunt doar de câteva ori au intrat în aceeași înregistrare la masă, dar, de asemenea, a avut mai multe ori să se refere la acesta din alte tabele, bunul, este permisă aplicația. De exemplu, fără a vedea că o anumită companie este deja prezentă în lista de contrapartide, utilizatorul a făcut la referință contrapartidă încă o dată cu o mică greșeală în titlu, astfel încât o piesă dublă pe numele nu a fost posibilă. Apoi a început o listă de persoane de contact, a completat directorul sinonimelor pentru numele companiei și a înregistrat câteva ordine. Ulterior sa dovedit că compania a lucrat cu această companie de mult timp și că deja a îndeplinit câteva duzini de ordine pentru aceasta. Și acum trebuie să scoatem din directorul companiilor o intrare suplimentară, trecând toate legăturile la acesta la înregistrarea din tabelul care rămâne.

Desigur, luând în considerare psihologia utilizatorului atunci când dezvoltați interfața de aplicație, poate reduce numărul de astfel de duplicate, dar nu cunosc o modalitate absolut fiabilă de a preveni un astfel de comportament al utilizatorilor. Tratarea manuală a problemei necesită prea mult timp pentru administratorul aplicației.

Dacă apare o problemă similară doar cu un singur tabel, puteți scrie procedura salvată doar pentru ea, dar ce se întâmplă dacă există mai multe astfel de tabele?

Această problemă nu poate apărea din cauza erorilor utilizatorului, ci, de exemplu, atunci când se unesc unități, atunci când toți angajații trebuie să fie transferați de la o unitate la alta.

Deci, hai să încercăm să dezvoltăm o procedură universală pentru eliminarea rândurilor duplicate în orice tabel care face referire. Pentru a simplifica sarcina, impunem următoarele restricții:
  1. Toate tabelele de aplicații sunt stocate în aceeași schemă; în ea vom crea procedura noastră.
  2. Toate tabelele au constrângeri de integritate - chei primare și străine.
  3. Sunt utilizate numai cheile primare simple (constând dintr-o coloană).

Mai întâi, extragem informațiile de care avem nevoie din dicționarul de date utilizând exemplul departamentului DEPARTAMENTE.

  1. Utilizând vizualizarea dicționarului de date user_constraints, găsim toate cheile externe care fac referire la cheia primară a tabelului DEPARTMENTS:
  2. Apoi, utilizând afișarea dicționarului user_cons_columns, găsiți numele tabelei și coloanelor corespunzătoare. Astfel, vom obține o listă de tabele și coloane ale căror valori vor trebui modificate:
  3. Folosind aceleași vizualizări ale dicționarului de date, găsiți în tabel numele coloanei cheii primare

Știind unitatea identificator, care trebuie lăsată (correct_id) și ID-ul udyalyaemogo unitate (drop_id), putem, folosind masă și coloana numele cheii externe derivate din a doua solicitare, generează o cerere de schimbare a valorilor străine cheie. Și din a treia interogare, obțineți comanda SQL pentru a elimina linia inutilă din tabelul DEPARTAMENTE. Dar noi mergem puțin mai departe, și de a crea o procedură stocată, care va fi suficient pentru a trece trei parametri - numele tabelului, corecte și ștergeți valoarea cheie primară, și va face totul pentru noi. Pentru a nu să se gândească la tipul coloanei cheii primare, a crea două proceduri identice cu același nume, folosind principiul de suprasarcină, „poke“, le într-un pachet stocat și îl numesc Doubles (vezi. Anexa 1).

Acum, pentru a executa ordinul directorului privind fuziunea departamentului contabil (DEPT_ID = 28) și departamentul financiar (DEPT_ID = 101), este suficient să executați comanda:

Anexa 1

Trebuie înțeles că fragmentarea tabelelor este diferită de fragmentarea fișierului. Atunci când o serie de operații DML sunt efectuate pe o masă, tabela este fragmentată deoarece DML nu eliberează spațiu pentru HWM.HWM este indicatorul de utilizare a blocului (BLOCURI UTILIZATE) din baza de date. Blocurile merg înainte.

Redenumirea implicit Permanent Tablespace prostranstvaTablichnoe spațiu tabelă SYSAUX TABLESPACE compozit TempDefault Permanent TablespaceOracle 9i a introdus conceptul unui spațiu de tabelă temporar în mod implicit (implicit TABLESPACE temporară), pentru a preveni accidentale.

ALTER nume_tabelă TABLE numai pentru citire; ALTER TABLE nume_tabelă Citire; Următorul script creează un tabel, populează cu câteva rânduri, apoi modul de masă ustanavilivaet "read-only" ro_tab TABLE .CREATE (ID NUMBER); INSERT INTO VALORI ro_tab (1); INSERT INTO VALORI ro_tab (2).

Procedura de creare este practic la fel ca versiunile anterioare - 9i și 10g. În baza de date vom crea următoarele opțiuni: OMF (Oracle Managed File) pentru fișiere de date, redo-log și fișiere de control. FRA (zona de recuperare flash) pentru arbori sau tăieturi de arhivă.

Nerespectarea faptului că toate modificările planului vor fi întotdeauna cele mai bune, au determinat anumiți clienți să își consolideze planurile de execuție (planurile stocate) sau să blocheze statisticile optimizatorului. Cu toate acestea, dacă acționăm în acest fel, ne lipsim de posibilitatea de ao folosi vreodată.

Articole similare