Comanda TRUNCATE are următoarea sintaxă:
TRUNCATE TABLE nume_tabel;
Exemplul 1
Dacă trebuie să ștergeți complet tabelul tovar, ar trebui să rulați comanda:
TRUNCATE TABLE tovar;
Comanda TRUNCATE vă permite să ștergeți un tabel imediat și complet și nu vă permite să ștergeți rânduri individuale care îndeplinesc orice condiții.
Comanda DELETE șterge înregistrările dintr-un tabel care îndeplinesc o anumită condiție. Efectuează două tipuri de îndepărtare:
- Ștergeți dintr-un tabel;
- Ștergerea în cascadă din mai multe tabele.
Ștergeți dintr-un tabel
DELETE FROM table_name
;
- Dacă este specificată LOW_PRIORITY, ștergerea nu va avea loc până când toți utilizatorii nu au terminat de citit tabelul.
- Instrucțiunea QUICK împiedică unirea indexurilor atunci când se efectuează o ștergere. Acest lucru accelerează oarecum procesul de eliminare.
- Clauza ORDER BY vă permite să comandați înregistrări înainte de a le șterge. În sine, această opțiune este lipsită de sens. Este util de utilizat în combinație cu instrucțiunea LIMIT.
- Instrucțiunea LIMIT specifică numărul de înregistrări care trebuie șterse.
Ștergere în cascadă
O ștergere în cascadă șterge nu numai înregistrarea principală, ci și înregistrările din alte tabele care conțin cheia externă a înregistrării master. Există două tipuri de tabele în MySQL:
- InnoDB, care acceptă mecanismul de comunicare cu cheia externă.
- MyISAM, care nu acceptă un mecanism de comunicare cu cheie străină. În acest caz, toate conexiunile sunt stocate exclusiv în memoria administratorului bazei de date și a programatorilor.
Pentru tabelele InnoDB, atunci când se construiește o cheie străină, reacția DBMS la ștergerea înregistrărilor asociate este întotdeauna descrisă. Reacția poate fi de trei tipuri:
- RESTRICȚI – restricție;
- CASCADE – ștergere în cascadă;
- SET NULL – setați valoarea NULL în locul valorilor cheii externe de la distanță.
Exemplul 4
Să existe un tabel tovar care să conțină o cheie străină - categ cu un link către tabelul de categorii.
Astfel, fiecare produs aparține unei categorii specifice:
Trebuie să ștergeți categoria „Vopsea și lac” din tabelul de categorii și să ștergeți în cascadă toate înregistrările asociate din tabelul tovar. Dacă în timpul creării cheii externe categ, reacția CASCADE a fost specificată la ștergere, atunci pentru a rezolva problema este suficient să rulați comanda:
DELETE FROM categorie WHERE categorie.categ_name=”vopsea și lac”;
Toate produsele care aparțin categoriei „vopsea și lac” vor fi eliminate automat din masa tovar asociată.
Cu toate acestea, dacă utilizatorul lucrează cu tabelele MyIsam, atunci DBMS nu știe despre nicio cheie străină și ștergerile în cascadă nu vor avea loc. În acest caz, formele speciale ale comenzii DELETE sunt utile, concepute pentru ștergerea în cascadă:
DELETE table_name [ ,table_name...]
ȘTERGE
FROM table_name, [table_name...] FOLOSING table_link
Exemplul 5
Problema din exemplul 4 poate fi rezolvată cu două comenzi echivalente:
DELETE tovar, categorie FROM tovar join categorie pe category.itcateg=tovar.categ unde category.name_categ=”Vopsea si lac”;
DELETE din tovar, categorie folosind tovar join categorie pe category.itcateg=tovar.categ unde category.name_categ=”Vopsea și lac”;
Nota 1
La prima vedere se pare că echipele
TRUNCATE nume_tabel;
DELETE FROM nume_tabel;
complet echivalent. Într-adevăr, amândoi șterg complet tabelul de toate înregistrările. Cu toate acestea, există încă o diferență.
Dacă se folosește TRUNCATE, atunci toate înregistrările sunt șterse simultan și când tabelul este reumplut, câmpurile cu autoincrement vor primi valori începând de la 1. Dacă se folosește DELETE, atunci ștergerea are loc câte o înregistrare și când tabelul este reumplut, câmpurile cu autoincrementare vor primi o valoare cu 1 mai mare decât ultima valoare ștearsă (adică, autoincrementarea va continua).
Acest capitol prezintă comenzi care controlează valorile prezentate într-un tabel. Când finalizați acest capitol, veți putea să plasați rânduri într-un tabel, să le ștergeți și să modificați valorile individuale reprezentate în fiecare rând. Se va afișa utilizarea interogărilor în formare grup complet rânduri de inserat și cum poate fi folosit un predicat pentru a controla modificarea valorilor și ștergerea rândurilor. Materialul din acest capitol constituie un corp complet de cunoștințe care arată cum să creați și să gestionați informații într-o bază de date. Modalități mai puternice de proiectare a predicatelor vor fi discutate în capitolul următor.
COMENZI DE MODIFICARE A LIMBAJULUI DML
Valorile pot fi inserate și eliminate din câmpuri folosind trei comenzi DML (Data Manipulation Language): INSERT, UPDATE, DELETE. Nu fi confuz, toate au fost menționate mai devreme în SQL ca comenzi de modificare.INTRODUCEREA VALORILOR
Toate rândurile din SQL sunt introduse folosind comanda de modificare INSERT. În forma sa cea mai simplă, INSERT folosește următoarea sintaxă: INSERT INTOTRUNCATE TABLE Laptop |
Transact-SQL extinde sintaxa instrucțiunilor ȘTERGE, introducând o propoziție suplimentară DIN
DIN<источник табличного типа>
Cu ajutor sursă tip tabel puteți specifica datele șterse din tabel din prima propoziție DIN.
Folosind această clauză, puteți efectua îmbinări de tabele, care înlocuiesc în mod logic utilizarea subinterogărilor în clauză UNDE pentru a identifica rândurile de șterse.
Să explicăm acest lucru cu un exemplu. Să presupunem că doriți să eliminați acele modele de PC din tabel Produs, pentru care nu există rânduri corespunzătoare în tabel PC.
Folosind sintaxa standard, această problemă poate fi rezolvată cu următoarea interogare:
Aceasta folosește o îmbinare exterioară, care provoacă coloana pc.model pentru modelele de PC care nu sunt enumerate în tabel PC, va conține o valoare NULL, care este folosită pentru a identifica rândurile de șterse.
SE APLICĂ LA:SQL Server(din 2008)Baza date SQL Azure SQL Data WarehouseDepozit de date paralel
Șterge unul sau mai multe rânduri dintr-un tabel sau vizualizare în SQL Server.
Sintaxă pentru SQL Server și Azure SQL Database [CU
CU<обобщенноеtabular expresie>
Specifică un set de rezultate denumit temporar, cunoscut și ca expresie de tabel comună, care este definit în domeniul de aplicare al instrucțiunii DELETE. Setul de rezultate este obținut din instrucțiunea SELECT.
Expresiile comune de tabel pot fi folosite și în instrucțiunile SELECT, INSERT, UPDATE și CREATE VIEW. Informații suplimentare vezi sectiunea.
TOP (expresie)
[LA SUTĂ]
Specifică numărul sau procentul de rânduri aleatorii care trebuie eliminate. expresie poate fi fie un număr, fie un procent din numărul de rânduri. Rândurile la care face referire expresia TOP folosită cu instrucțiunile INSERT, UPDATE și DELETE nu sunt ordonate. Pentru mai multe informații, consultați .
DIN
Un cuvânt cheie opțional care poate fi utilizat între cuvântul cheie DELETE și țintă table_or_view_name, sau rowset_function_limited.
table_alias
Pseudonim specificat în propoziție sursă_tabelă o clauză reprezentând tabelul sau vizualizarea din care rândurile vor fi șterse.
numele serverului
Nume server (folosind numele server legat sau funcţionează ca nume al serverului) pe care se află tabelul sau vizualizarea. Dacă numele serverului indicat, Nume bazele dateȘi nume_schemă sunt obligatorii.
Nume bazele date
Numele bazei de date.
nume_schemă
Numele schemei căreia îi aparține tabelul sau vizualizarea.
table_or view_name
Numele tabelului sau al vizualizării din care sunt șterse rândurile.
O variabilă de tabel din domeniul său poate fi folosită și ca sursă de tabel într-o instrucțiune DELETE.
Vedeți referințele table_or_view_name trebuie să fie actualizabil și să facă referire la exact un tabel de bază în clauza FROM a definiției vizualizării. Pentru mai multe informații despre vizualizările reîmprospătabile, consultați .
rowset_function_limited
Returnează rândurile sau expresiile șterse bazate pe acestea ca parte a unei operațiuni DELETE. Clauza OUTPUT nu este acceptată în nicio instrucțiune DML care vizează vizualizări sau tabele la distanță. Pentru mai multe informații, consultați .
DIN sursă_tabelă
Specifică o clauză FROM suplimentară. Această extensie Transact-SQL DELETE vă permite să specificați date din
Această extensie, care specifică o îmbinare, poate fi utilizată în locul unei subinterogări în clauza WHERE pentru a specifica rândurile care urmează să fie șterse.
Pentru mai multe informații, consultați .
UNDE
Specifică condițiile utilizate pentru a limita numărul de rânduri șterse. Dacă nu este specificată clauza WHERE, instrucțiunea DELETE șterge toate rândurile din tabel.
Există două tipuri de operații de ștergere, în funcție de ceea ce este specificat în clauza WHERE.
Operațiile de ștergere de căutare specifică o condiție de căutare pentru a rafina rândurile care vor fi șterse. De exemplu, UNDE nume_coloană = sens.
Operațiile de ștergere pozițională folosesc clauza CURRENT OF pentru a specifica cursorul. Ștergerea se efectuează la poziția curentă a cursorului. Aceasta poate fi mai precisă decât o instrucțiune DELETE găsită folosind clauza condiție_căutare clauză pentru specificarea rândurilor care urmează să fie șterse. O instrucțiune DELETE pentru o potrivire șterge mai multe rânduri, cu excepția cazului în care condiția de căutare identifică unic un rând.
Specifică condițiile limită pentru rândurile care urmează să fie șterse. Nu există limită pentru numărul de predicate pe care o condiție de căutare poate conține. Pentru mai multe informații, consultați .
CURENTUL DE
Specifică executarea unei instrucțiuni DELETE la poziția curentă a cursorului specificat.
GLOBAL
Indică faptul că cursor_name se referă la cursorul global.
cursor_name
Numele cursorului deschis din care se face selecția. Dacă cursorul global și local este numit cursor_name există, acest argument se referă la cursorul global dacă este specificat GLOBAL; în caz contrar, se referă la cursorul local. Cursorul trebuie să permită actualizări.
cursor_variable_name
Numele variabilei cursorului. Variabila cursor trebuie să conțină o referință la un cursor ale cărui actualizări sunt permise.
OPȚIUNE (
Cuvinte cheie care indică faptul că sugestiile de optimizare sunt aplicate la ajustarea modului în care Motorul de baze de date procesează instrucțiunea. Pentru mai multe informații, consultați .
Pentru a șterge toate rândurile dintr-un tabel, utilizați instrucțiunea TRUNCATE TABLE. Instrucțiunea TRUNCATE TABLE este mai rapidă decât instrucțiunea DELETE și utilizează mai puține resurse de sistem și de jurnal de tranzacții. Instrucțiunea TRUNCATE TABLE are limitări, de exemplu, tabela nu poate participa la replicare. Pentru mai multe informații, vezi
Utilizați funcția @@ROWCOUNT pentru a returna numărul de rânduri eliminate aplicației client. Pentru mai multe informații, consultați .
Puteți implementa gestionarea erorilor pentru instrucțiunea DELETE prin includerea acesteia într-o construcție TRY...CATCH.
O instrucțiune DELETE poate eșua dacă încalcă un declanșator sau încearcă să ștergă un rând la care se referă datele dintr-un alt tabel folosind o constrângere FOREIGN KEY. Dacă o instrucțiune DELETE șterge mai multe rânduri și unul dintre rândurile șterse încalcă un declanșator sau o constrângere, atunci instrucțiunea este anulată, de exemplu. Este returnată o eroare și rândurile nu sunt șterse.
Dacă apare o eroare aritmetică (depășire, împărțire la zero sau în afara limitelor) în timpul evaluării unei expresii în timpul unei instrucțiuni DELETE, Motorul de bază de date va trata erorile ca și cum SET ARITHABORT ar fi fost setat la ON. Restul operațiunii în lot este anulat și este returnat un mesaj de eroare.
Instrucțiunea DELETE poate fi utilizată în corpul unei funcții definite de utilizator dacă obiectul care este modificat este o variabilă de tabel.
Când ștergeți un rând care conține o coloană FILESTREAM, fișierele asociate acestuia sunt, de asemenea, șterse Sistemul de fișiere. Fișiere de bază sunt eliminate de colectorul de gunoi FILESTREAM. Pentru mai multe informații, consultați .
Clauza FROM nu poate fi specificată într-o instrucțiune DELETE care face referire (direct sau indirect) la o vizualizare care specifică un declanșator INSTEAD OF. Consultați declanșatoarele INSTEAD pentru mai multe informații.
Când utilizați o expresie TOP într-o instrucțiune DELETE, rândurile la care se face referire nu sunt ordonate, iar clauza ORDER BY nu poate fi specificată în mod explicit în instrucțiune. Dacă doriți să utilizați clauza TOP pentru a elimina rândurile într-o ordine cronologică semnificativă, ar trebui să utilizați ORDER BY împreună cu ea într-o instrucțiune de interogare subselect. Consultați secțiunea Exemple mai târziu în această secțiune.
Clauza TOP nu poate fi utilizată cu instrucțiunea DELETE pentru vizualizările partiționate.
În mod implicit, instrucțiunea DELETE dobândește întotdeauna un blocaj exclusiv (X) pe tabelul pe care îl modifică și păstrează blocarea până la finalizarea tranzacției. Dacă o resursă este deținută cu o blocare exclusivă (X), atunci alte tranzacții nu pot modifica datele. Citirile vor fi permise numai dacă există un indiciu NOLOCK sau un nivel de izolare a citirii necommitat. Este posibil să se suprascrie comportamentul implicit al optimizatorului de interogări folosind indicii de tabel în timpul execuției unei instrucțiuni DELETE prin specificarea unei alte metode de blocare, dar utilizarea indicii de tabel este recomandată numai dezvoltatorilor și administratorilor de baze de date cu experiență și numai atunci când este absolut necesar. Pentru mai multe informații, consultați .
Când rândurile sunt eliminate din heap, Motorul de bază de date poate folosi rândul sau pagina de blocare pentru operație. Ca urmare pagini goale, unde sunt efectuate operațiuni de ștergere, rămân alocate heap-ului. Dacă nu sunt eliberați, spațiul pe care îl ocupă nu poate fi folosit pentru alte obiecte de bază de date.
Pentru a elimina rânduri din heap și pagini gratuite, utilizați una dintre următoarele metode.
Specificați instrucțiunile TABLOCK în instrucțiunea DELETE. Utilizarea TABLOCK va face ca operația de ștergere să ia o blocare exclusivă a tabelului, mai degrabă decât o blocare a rândului sau a paginii, permițând eliberarea paginilor. Pentru mai multe informații despre promptul TABLOCK, consultați .
Dacă eliminați toate rândurile dintr-un tabel, utilizați instrucțiunea TRUNCATE TABLE.
Înainte de a șterge rândurile, creați un index grupat pe heap. Apoi poate fi îndepărtat. Această metodă va dura mai mult timp și va consuma mai multe resurse temporare.
O instrucțiune DELETE este întotdeauna complet înregistrată.
Permisiuni
Permisiunile DELETE sunt necesare pe tabelul țintă. Permisiunile SELECT sunt, de asemenea, necesare dacă instrucțiunea conține o clauză WHERE.
Eliminați permisiunea implicită pentru membri administrator de sistem rol de server fix db_ownerȘi db_datawriter Rolurile bazei de date fixe și proprietarul tabelului. Membrii administrator de sistem, db_ownerȘi db_securityadmin rolurile, precum și proprietarul tabelului, pot transfera permisiunile altor utilizatori.
Sintaxa de bază
Exemplele din această secțiune descriu funcționalitatea de bază a instrucțiunii DELETE folosind sintaxa minimă necesară.
A. Folosind o instrucțiune DELETE fără o clauză WHERE
Următorul exemplu șterge toate rândurile din tabelul SalesPersonQuotaHistory din baza de date AdventureWorks2012, deoarece nu este specificată clauza WHERE care limitează numărul de rânduri care pot fi șterse.
DELETE FROM Sales.SalesPersonQuotaHistory; MERGE
Limitarea rândurilor care urmează să fie șterse
Exemplele din această secțiune descriu modalități de a limita numărul de rânduri șterse.
A. Utilizarea unei clauze WHERE pentru a șterge un set de rânduri
Următorul exemplu șterge toate rândurile din tabelul ProductCostHistory din baza de date AdventureWorks2012 care au o valoare în coloana StandardCost mai mare de 1000,00.
Următorul exemplu arată utilizarea unei clauze WHERE mai complexe. Clauza WHERE specifică două condiții care trebuie îndeplinite pentru a determina rândurile de șterse. Valoarea din coloana StandardCost trebuie să fie între 12.00 și 14.00, iar valoarea din coloana SellEndDate trebuie să fie NULL. Acest exemplu tipărește și valoarea din funcția **@@ROWCOUNT** pentru a returna numărul de rânduri eliminate.
B. Folosind un cursor pentru a determina rândul de șters
Următorul exemplu șterge un rând din EmployeePayHistory din tabelul bazei de date AdventureWorks2012 folosind my_cursor. Operația de ștergere afectează doar un rând selectat în acest moment cursor.
DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate<>(SELECT MAX (RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ; OPEN complex_cursor; FETCH FROM complex_cursor; DELETE FROM HumanResources.EmployeePayHistory WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; MERGE
C. Utilizarea operatorilor de îmbinare și a interogărilor imbricate asupra datelor dintr-un tabel pentru a șterge rânduri dintr-un alt tabel
Următoarele exemple arată două moduri de a șterge rânduri dintr-un tabel pe baza datelor dintr-un alt tabel. În ambele exemple, rândurile din SalesPersonQuotaHistory din tabelul AdventureWorks2012 șterg baza de date pe baza vânzărilor de la începutul anului stocate în tabelul SalesPerson. Prima instrucțiune DELETE arată o soluție pentru o subinterogare conformă ISO, iar a doua arată o instrucțiune Transact-SQL DELETE dintr-o extensie pentru a uni două tabele.
A. Limitarea numărului de rânduri care trebuie șterse folosind cuvântul cheie TOP
Când TOP ( n) folosind propunerea de ștergere, operația de ștergere se efectuează pe selectate aleatoriu n linii. Următorul exemplu șterge 20 de rânduri aleatorii din tabelul PurchaseOrderDetail din baza de date AdventureWorks2012 care au o dată anterioară datei de 1 iulie 2006:
Dacă doriți să utilizați clauza TOP pentru a elimina rândurile într-o ordine cronologică semnificativă, ar trebui să utilizați ORDER BY împreună cu ea într-o instrucțiune de interogare subselect. Următoarea interogare elimină cele 10 rânduri care au cea mai veche dată din tabelul PurchaseOrderDetail. Pentru a vă asigura că sunt șterse numai 10 rânduri, coloana specificată în instrucțiunea de subinterogare select (PurchaseOrderID) trebuie să fie cheia principala Mese. Utilizarea unei coloane fără cheie într-o instrucțiune de subselectare poate duce la ștergerea a mai mult de 10 rânduri dacă coloana specificată conține valori duplicat.
Eliminarea rândurilor dintr-un tabel la distanță
Exemplele din această secțiune descriu modalități de ștergere a rândurilor dintr-un tabel la distanță folosind sau ca referință la tabelul de la distanță. Tabelul la distanță există pe alt server sau instanță SQL Server.
Aplicabil la: SQL Server 2008 la SQL Server 2016. |
A. Ștergerea datelor dintr-un tabel la distanță folosind un server conectat
Următorul exemplu va șterge un rând dintr-un tabel la distanță. Exemplul începe prin crearea unei legături către o sursă de date la distanță folosind . Numele serverului legat, MyLinkServer, este apoi specificat ca parte a numelui obiectului din patru părți sub forma server.catalog.schema.obiect.
USE master; GO -- Creați un link către sursa de date de la distanță. -- Specificați un nume de server valid pentru @datasrc ca „nume_server” sau „nume_server\nume_instanță” . EXEC sp_addlinkedserver @server = N"MyLinkServer" , @srvproduct = N" " , @provider = N"SQLNCLI" , @datasrc = N"nume_server" , @catalog = N"AdventureWorks2012" ; MERGE
B. Eliminarea datelor dintr-un tabel la distanță folosind funcția OPENQUERY
Următorul exemplu șterge rânduri dintr-un tabel la distanță apelând o funcție care returnează un set de rânduri. Acest exemplu folosește numele serverului conectat creat în exemplul anterior.
B. Eliminarea datelor dintr-un tabel la distanță folosind funcția OPENDATASOURCE
Următorul exemplu șterge rânduri dintr-un tabel la distanță apelând o funcție care returnează un set de rânduri. Specificați un nume de server valid pentru sursa de date folosind formatul numele serverului sau nume_server\nume_instanță.
Declarație UPDATE folosit pentru a modifica rândurile de tabel. Această instrucțiune are următoarea formă generală:
Rândurile din tabelul tab_name sunt selectate pentru modificare pe baza unei condiții din clauza WHERE. Valorile coloanei fiecărui rând modificat sunt modificate folosind Oferte SET O instrucțiune UPDATE care atribuie o expresie (de obicei) sau o constantă coloanei corespunzătoare. Dacă nu există o clauză WHERE, atunci instrucțiunea UPDATE modifică toate rândurile din tabel. Utilizarea instrucțiunilor UPDATE datele poate fi modificat doar într-un singur tabel.
În exemplul de mai jos, instrucțiunea UPDATE modifică doar un rând din tabelul Works_on deoarece combinația coloanelor EmpId și ProjectNumber este cheia primară a tabelului respectiv și, prin urmare, este unică. ÎN în acest exemplu se modifică poziția unui angajat a cărui valoare era necunoscută anterior sau avea o valoare NULL:
În exemplul de mai jos, rândurilor de tabel li se atribuie valori folosind o expresie. Interogarea recalculează bugetele tuturor proiectelor de la dolari la euro:
UTILIZAȚI SampleDb; UPDATE Project SET Buget = Buget * 0,9;
Acest exemplu modifică toate rândurile din tabelul Project deoarece interogarea nu are o clauză WHERE.
Exemplul de mai jos folosește o subinterogare în clauza WHERE a instrucțiunii UPDATE. Deoarece este utilizat operatorul IN, această interogare poate returna mai mult de un rând:
Conform acestei interogări, pentru angajata Natalya Vershinina, valoarea NULL este atribuită coloanei de poziție în toate proiectele sale. Interogarea din acest exemplu poate fi executată și folosind clauza FROM a instrucțiunii UPDATE. Clauza FROM specifică numele tabelelor care sunt procesate de instrucțiunea UPDATE. Toate aceste mese trebuie să fie unite în viitor. Utilizarea clauzei FROM este prezentată în exemplul de mai jos. În mod logic, acest exemplu este identic cu cel precedent:
Exemplul de mai jos arată utilizarea expresii CASEîn declarația UPDATE. (O discuție detaliată a acestei expresii a fost descrisă mai devreme.) În acest exemplu, trebuie să creșteți bugetul tuturor proiectelor cu un anumit număr de procente (20, 10 sau 5), în funcție de suma bugetului inițial: cu cât bugetul este mai mic. , cu atât creșterea sa procentuală ar trebui să fie mai mare:
UTILIZAȚI SampleDb; UPDATE Project SET Buget = CASE WHEN Buget > 0 AND Budget 100000 AND Budget
Declarația DELETE
Instrucțiunea DELETE șterge rânduri dintr-un tabel. Similar cu instrucțiunea INSERT, această instrucțiune are, de asemenea, două forme diferite:
Toate rândurile care îndeplinesc condiția din clauza WHERE sunt șterse. Listarea explicită a coloanelor într-o instrucțiune DELETE nu este neapărat necesară, dar nici măcar nu este permisă, deoarece această instrucțiune operează pe rânduri, nu pe coloane. Prima formă a instrucțiunii DELETE este folosită în exemplul de mai jos, care șterge toți angajații cu titlul „Manager” din tabelul Works_on:
Clauza WHERE a unei instrucțiuni DELETE poate conține o subinterogare, așa cum se arată în exemplul de mai jos:
De când angajata Vershinina a demisionat, toate înregistrările asociate cu ea sunt șterse din baza de date. Interogarea din acest exemplu poate fi executată și folosind o clauză FROM, așa cum se arată mai jos. În acest caz, semantica acestei clauze este aceeași cu clauzele FROM din instrucțiunea UPDATE.
Utilizarea unei clauze WHERE într-o instrucțiune DELETE este opțională. Dacă această clauză lipsește, atunci toate rândurile sunt șterse din tabel:
UTILIZAȚI SampleDb; -- Ștergerea tuturor rândurilor tabelului DELETE FROM Works_on;
Instrucțiunile DELETE și DROP TABLE sunt destul de diferite unele de altele. Instrucțiunea DELETE șterge (parțial sau complet) conținutul unui tabel, în timp ce instrucțiunea DROP TABLE șterge atât conținutul, cât și schema tabelului. Astfel, după ștergerea tuturor rândurilor folosind o instrucțiune DELETE, tabelul continuă să existe în baza de date, dar după executarea unei instrucțiuni DROP TABLE, tabelul nu mai există.
Alte instrucțiuni Transact-SQL și sugestii pentru modificarea tabelelor
SQL Server acceptă următoarele instrucțiuni și sugestii suplimentare pentru modificarea tabelelor:
instrucțiunea TRUNCATE TABLE;
instrucțiunea MERGE;
clauza OUTPUT.
Aceste instrucțiuni și propuneri sunt discutate în următoarele subsecțiuni.
Instrucțiunea TRUNCATE TABLE
Instrucțiunea TRUNCATE TABLE este mai mult versiune rapida DELETE instrucțiuni fără o clauză WHERE. Această instrucțiune șterge toate rândurile unui tabel mai repede decât instrucțiunea DELETE, deoarece șterge conținutul pagină cu pagină, în timp ce instrucțiunea DELETE face acest lucru rând cu rând. Instrucțiunea TRUNCATE TABLE este o extensie Transact-SQL a standardului SQL. O altă diferență importantă cu această declarație este că resetează indexul unei coloane care are specificată proprietatea de auto-increment IDENTITY.
Instrucțiunea TRUNCATE TABLE are următoarea sintaxă:
TRUNCATE TABLE nume_tabel
Instrucțiunea MERGE
Instrucțiunea MERGE combină o secvență de instrucțiuni INSERT, UPDATE și DELETE într-o singură instrucțiune elementară, în funcție de existența unei înregistrări (rând). Cu alte cuvinte, puteți sincroniza două tabele diferite pentru a modifica conținutul tabelului țintă pe baza diferențelor găsite în tabelul sursă.
Aplicația principală pentru instrucțiunea MERGE este într-un mediu de depozit de date, în care tabelele trebuie actualizate periodic pentru a reflecta noile date care sosesc cu Sisteme de procesare a tranzacțiilor OLTP (On-Line Transaction Processing).. Aceste date pot conține modificări ale rândurilor de tabel existente și/sau linie nouă, care trebuie introduse în tabele. Dacă un rând din noile date se potrivește cu o înregistrare care există deja în tabel, este executată o instrucțiune UPDATE sau DELETE. În caz contrar, instrucțiunea INSERT este executată.
Alternativ, în loc de o instrucțiune MERGE, puteți utiliza o secvență de instrucțiuni INSERT, UPDATE și DELETE care decid pentru fiecare rând dacă să inserați, să ștergeți sau să actualizați. Dar această abordare are un dezavantaj semnificativ de performanță: necesită treceri multiple prin date, iar datele sunt procesate pe o bază de înregistrare cu înregistrare.
clauza OUTPUT
În mod implicit, singurul rezultat vizibil al unei instrucțiuni INSERT, UPDATE sau DELETE este un mesaj despre numărul de rânduri modificate, cum ar fi „3 rânduri ȘTERSE”, iar sistemul nu stochează informații despre datele modificate. Dacă un astfel de rezultat vizibil nu vă satisface cerințele, atunci puteți utiliza clauza OUTPUT, care afișează rândurile modificate, inserate sau șterse.
Clauza OUTPUT este aplicabilă și cu instrucțiunea MERGE, pentru care scoate toate rândurile modificate dintr-un tabel.
Clauza OUTPUT afișează rezultatele operațiilor executate ale instrucțiunilor corespunzătoare în tabelele introduse și șterse. În plus, pentru a popula tabelele, trebuie să utilizați o expresie INTO în clauza OUTPUT. Prin urmare, o variabilă de tabel este utilizată pentru a stoca rezultatul.
![](https://shongames.ru/wp-content/plugins/wpfront-scroll-top/images/icons/1.png)