Transact-SQL - modificarea și ștergerea datelor. Ajutor SQL(DML): Declarații UPDATE și DELETE Ștergere Declarație sql

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 INTO VALORI (, . . .); Deci, de exemplu, pentru a introduce un rând în tabelul de vânzători, puteți utiliza următoarea condiție: INSERT INTO Salespeople VALUES (1001, „Peel”, „Londra”, .12); Comenzile DML nu produc nicio ieșire, dar programul dvs. ar trebui să vă ofere o anumită confirmare că datele au fost utilizate.

Tabelul (în cazul nostru, Salespeople) trebuie să fie definit anterior în comanda CREATE TABLE (vezi Capitolul 17), iar fiecare valoare numerotată din clauza value trebuie să se potrivească cu tipul de date al coloanei în care este inserată. În ANSI, aceste valori nu pot forma expresii, ceea ce înseamnă că 3 este disponibil, dar expresia 2 + 1 nu este. Valorile, desigur, sunt introduse în tabel în ordinea numelui, astfel încât prima valoare cu un nume ajunge automat în coloana 1, a doua în coloana 2 și așa mai departe.

INSERAREA POINTERE NUL

Dacă trebuie să introduceți o valoare nulă, o introduceți la fel ca o valoare normală. Să presupunem că nu a existat încă un gen de oraș pentru domnul Peel. Puteți introduce un șir cu value=NULL în acest câmp astfel: INSERT INTO Salespeople VALUES (1001, „Peel”, NULL, .12); Deoarece NULL este un simbol special și nu doar o valoare de caracter, nu este inclus între ghilimele simple.

DENUMIREA unei coloane de inserat

De asemenea, puteți specifica coloanele în care doriți să introduceți valoarea numelui. Acest lucru vă permite să introduceți nume în orice ordine. Să presupunem că luați valorile pentru tabelul Clienți dintr-un raport de imprimantă care le pune în această ordine: oraș, cname și cnum, iar pentru a simplifica lucrurile, doriți să introduceți valorile în aceeași ordine: INSERT INTO Clienți (oraș, cname, cnum ) VALORI („Londra”, „Honman”, 2001); Vă rugăm să rețineți că coloanele de rating și snum lipsesc. Aceasta înseamnă că aceste linii sunt setate automat la valoarea lor implicită. Valoarea implicită poate fi fie NULL, fie o altă valoare definită ca implicită. Dacă o constrângere interzice utilizarea unei valori NULL într-o coloană dată și acea coloană nu este setată ca implicită, acea coloană trebuie să fie furnizată cu o valoare pentru orice comandă INSERT care se aplică tabelului (a se vedea Capitolul 18 pentru informații despre NULL și constrângeri „implicite”).

INSERAREA REZULTATELOR ÎNTREBĂRII

De asemenea, puteți utiliza comanda INSERT pentru a obține sau selecta valori dintr-un tabel și a le plasa într-un altul pentru a le utiliza cu o interogare. Pentru a face acest lucru, pur și simplu înlocuiți clauza VALUES (din exemplul anterior) cu interogarea corespunzătoare: INSERT INTO Londonstaff SELECT * FROM Salespeople WHERE oraș = "Londra"; Aici sunt selectate toate valorile produse de interogare - adică toate rândurile din tabelul Vânzători cu valorile oraș = „Londra” - și plasate într-un tabel numit Londonstaff. Pentru ca acest lucru să funcționeze, masa Londonstaff trebuie să îndeplinească următoarele condiții:

* Trebuie să fi fost deja creat cu comanda CREATE TABLE.

* Trebuie să aibă patru coloane care să se potrivească cu tabelul

Vânzători în ceea ce privește tipul de date; adică prima, a doua și așa mai departe, coloanele fiecărui tabel trebuie să aibă același tip de date (și nu ar trebui să aibă aceleași nume).

Regula generala faptul că coloanele din tabel introduse trebuie să se potrivească cu coloanele rezultate de subinterogare, în acest caz, pentru întregul tabel Vânzători. Londonstaff este acum o masă independentă care a primit unele valori de la tabelul de vânzători. Dacă valorile din tabelul Vânzători ar fi schimbate brusc, acest lucru nu ar avea niciun efect asupra tabelului Londonstaff (deși ați putea crea un astfel de efect utilizând VIEW-ul descris în Capitolul 20). Deoarece fie o interogare, fie o comandă INSERT pot specifica coloanele după nume, puteți, dacă doriți, să mutați numai coloanele selectate și, de asemenea, să reordonați numai coloanele pe care le selectați.

Să presupunem, de exemplu, că decideți să creați un nou tabel numit Daytotals, care pur și simplu va ține evidența sumelor totale de achiziții organizate pentru fiecare zi. Puteți introduce aceste date independent de tabelul Comenzi, dar mai întâi trebuie să completați tabelul Daytotals cu informațiile furnizate anterior în tabelul Comenzi.

Înțelegând că tabelul Comenzi acoperă ultimul an fiscal, și nu doar câteva zile, ca în exemplul nostru, puteți observa avantajul utilizării următoarei clauze INSERT în numărarea și introducerea valorilor INSERT INTO Daytotals (data, total) SELECT odate, SUM (amt) FROM Orders GROUP BY data; Rețineți că, așa cum sa sugerat mai devreme, numele coloanelor din tabelul Comenzi și din tabelul Daytotals nu trebuie să fie identice. De asemenea, dacă data achiziției și cantitatea totală sunt singurele coloane din tabel și sunt în in aceasta ordine, numele lor pot fi excluse din ieșire din cauza simplității lor aparente.

ȘTERGEREA RINDURILOR DIN TABELE

Puteți șterge rânduri dintr-un tabel cu comanda de modificare - DELETE. Poate șterge doar rândurile introduse, nu valorile câmpurilor individuale, astfel încât parametrul câmpului este opțional sau indisponibil. Pentru a șterge întregul conținut al tabelului de vânzători, puteți introduce următoarea condiție: DELETE FROM Salespeople; Acum că tabelul este gol, acesta poate fi abandonat definitiv cu comanda DROP TABLE (aceasta este explicată în Capitolul 17). De obicei, trebuie doar să ștergeți anumite rânduri dintr-un tabel. Pentru a determina ce rânduri vor fi șterse, utilizați un predicat, așa cum ați făcut pentru interogări. De exemplu, pentru a elimina agentul de vânzări Axelrod din tabel, puteți introduce DELETE FROM Salespeople WHERE snum = 1003; Am folosit câmpul snum în loc de câmpul sname, deoarece aceasta este cea mai bună tactică atunci când folosiți chei primare când doriți ca unul și doar un rând să fie afectat. Pentru tine - aceasta este similară cu acțiunea cheii primare. Desigur, puteți utiliza și DELETE cu un predicat care selectează un grup de rânduri, așa cum se arată în acest exemplu: DELETE FROM Salespeople WHERE oraș = "Londra";

MODIFICAREA VALORILOR CÂMPULUI

Acum că puteți introduce și șterge rânduri de tabel, ar trebui să învățați cum să modificați unele sau toate valorile dintr-un rând existent. Acest lucru se face cu comanda UPDATE. Această comandă conține o clauză UPDATE care specifică tabelul de utilizat și o clauză SET care specifică modificarea care trebuie făcută într-o anumită coloană. De exemplu, pentru a modifica evaluările tuturor clienților la 200, puteți introduce evaluarea UPDATE Customers SET = 200;

MODIFICAREA DOAR RANDURI SPECIFICE

Desigur, nu veți dori întotdeauna să specificați toate rândurile unui tabel pentru a schimba o singură valoare, așa că UPDATE, precum DELETE, poate lua predicate. Iată cum, de exemplu, puteți face aceeași modificare pentru toți clienții vânzătorului Peel (având snum=1001): UPDATE Customers SET rating = 200 WHERE snum = 1001;

COMANDA DE ACTUALIZARE PENTRU MULTE COLONI

Cu toate acestea, nu ar trebui să vă limitați la actualizarea unei singure coloane folosind comanda UPDATE. Clauza SET poate desemna orice număr de coloane, separate prin virgule. Toate numiri specificate poate fi făcut pentru oricine rând de masă, dar numai unul câte unul. Să presupunem că un agent de vânzări Motika s-a pensionat și dorim să-i reatribuim numărul unui nou agent de vânzări: UPDATE Salespeople SET sname = "Gibson",city = "Boston",comm = .10 WHERE snum = 1004; Această echipă va transfera noului dealer Gibson toți clienții actuali ai fostului dealer Motika și comenzile așa cum au fost întocmite pentru Motika folosind snum. Cu toate acestea, nu puteți modifica mai multe tabele simultan într-o singură comandă, în parte pentru că nu puteți prefix tabelele cu coloane modificate de clauza SET. Cu alte cuvinte, nu puteți spune „SET Salespeople.sname = Gibson” într-o comandă UPDATE, puteți spune doar „SET sname = Gibson”.

UTILIZAREA EXPRESIUNILOR PENTRU MODIFICARE

Cu toate acestea, puteți utiliza expresii scalare în clauza SET a unei comenzi UPDATE, incluzând-o în expresia de gen care va fi modificată. Aceasta este diferită de clauza VALUES a comenzii INSERT, în care expresiile nu pot fi folosite; Această proprietate a expresiilor scalare este o caracteristică foarte utilă. Să presupunem că decizi să dublezi comisioanele tuturor agenților tăi de vânzări. Puteți folosi următoarea expresie: UPDATE Salespeople SET comm = comm * 2; Ori de câte ori te referi la valoare specificată coloana SET din clauza SET, valoarea produsă poate fi obținută din rândul curent înainte de a se face unele modificări cu ajutorul comenzii UPDATE. Desigur, puteți combina aceste caracteristici și spune - dublați comisionul pentru toți vânzătorii din Londra, cu această propoziție: UPDATE Salespeople SET comm = comm * 2 WHERE city = "Londra";

MODIFICAREA VALORILOR NULL

Clauza SET nu este un predicat. El poate introduce valori NULL goale la fel cum a introdus valori, fără a utiliza vreo sintaxă specială (cum ar fi IS NULL). Deci, dacă doriți să setați toate evaluările clienților din Londra la NULL, puteți introduce următoarea declarație: UPDATE customers SET rating = NULL WHERE oraș = "Londra"; care va reseta toate evaluările clienților din Londra.

REZUMAT

Acum ați stăpânit arta de a gestiona conținutul bazei de date folosind trei comenzi simple: INSERT - folosit pentru a insera rânduri în baza de date; DELETE - pentru a le șterge; REFERINȚE - pentru a modifica valorile în rândurile deja introduse. Ați învățat să utilizați un predicat cu comenzile UPDATE și DELETE pentru a determina ce rânduri va afecta comanda. Desigur, predicatele ca atare nu au sens pentru INSERT, deoarece rândul în cauză nu există în tabel până la finalizarea comenzii INSERT. Cu toate acestea, puteți utiliza interogări INSERT pentru a pune toate seturile de rânduri într-un tabel simultan. Mai mult, puteți face acest lucru cu coloane în orice ordine. Ați învățat că valorile implicite pot fi plasate în coloane, cu excepția cazului în care setați valoarea în mod explicit. Ați văzut, de asemenea, utilizarea valorii implicite standard, care este NULL. De asemenea, v-ați dat seama că UPDATE poate folosi o expresie de valoare, în timp ce INSERT nu poate. Următorul capitol vă va extinde cunoștințele, arătându-vă cum să utilizați subinterogări cu aceste comenzi. Aceste subinterogări sunt similare cu cele cu care sunteți deja familiarizați, dar există câteva implicații și limitări speciale atunci când sunt utilizate subinterogări în comenzile DML, despre care vom discuta în Capitolul 16.

LUCRU CU SQL

1. Scrieți o comandă care să plaseze următoarele valori, în ordinea lor de mai jos, în tabelul Vânzători: oraș - San Jose, nume - Bianco, comm - NULL, cnum - 1100. 2. Scrieți o comandă care ar elimina toți clienții Clemens comenzi din tabelul Comenzi .

3. Scrieți o comandă care ar crește evaluările tuturor clienților din Roma cu 100.

4. Vânzătorul Serres a părăsit compania. Realocați clienții săi vânzătorului Motika.

Operator ACTUALIZAȚI modifică datele existente în tabel. Comanda are următoarea sintaxă

ACTUALIZAȚI<имя таблицы>
SET (nume coloană = (expresie pentru a calcula valoarea coloanei
| NUL
| MOD IMPLICIT),...)
[ (UNDE<предикат>}];

O singură declarație poate fi folosită pentru a seta valori pentru orice număr de coloane. Totuși, în aceeași declarație ACTUALIZAȚI Puteți face modificări în fiecare coloană dintr-un tabel specificat o singură dată. În lipsa unei oferte UNDE Toate rândurile tabelului vor fi actualizate.

Dacă o coloană poate fi NULL, o puteți specifica în mod explicit. De asemenea, puteți înlocui valoarea existentă cu valoarea implicită ( MOD IMPLICIT) pentru o coloană dată.

Desigur, tipurile de date coloane hdȘi RAM trebuie să fie compatibil. O expresie poate fi folosită pentru a proiecta tipuri CAST.

Dacă trebuie să modificați datele în funcție de conținutul unei anumite coloane, puteți utiliza expresia CAZ. Dacă, să zicem, trebuie să puneți hard disk-uri cu o capacitate de 20 GB pentru notebook-uri PC cu memorie mai mică de 128 MB și 40 GB pentru alte notebook-uri PC, atunci puteți scrie următoarea solicitare:

Este necesar să spunem câteva cuvinte despre coloanele cu incrementare automată. Dacă coloana cod in masa Laptop definit ca IDENTITATE(1,1), apoi următorul operator

Desigur, o altă linie cu valoarea cod=5 nu ar trebui să fie în tabel.

În Transact-SQL operatorul ACTUALIZAȚI extinde standardul prin utilizarea unei clauze opționale DIN. Această clauză specifică un tabel care furnizează criteriile pentru operația de actualizare. O flexibilitate suplimentară aici este oferită de utilizarea operațiunilor de îmbinare la tabel.

Exemplu . Să presupunem că trebuie să indicați „Fără PC” (fără PC) în coloană tip pentru acele modele de PC de pe masa Produs PC. Soluția prin alăturarea tabelelor poate fi scrisă după cum urmează:

Declarația DELETE

Operator ȘTERGEșterge rânduri din tabele de bază temporare sau permanente, vizualizări sau cursoare, iar în ultimele două cazuri, acțiunea operatorului se extinde la acele tabele de bază din care datele au fost preluate în aceste vizualizări sau cursore. Operatorul de ștergere are o sintaxă simplă:

ȘTERGERE DIN<имя таблицы > ;

Dacă oferta UNDE lipsește, elimină toate rândurile din tabel sau din vizualizare (vizualizarea trebuie să fie actualizabilă). Această operație (ștergerea tuturor rândurilor dintr-un tabel) poate fi, de asemenea, efectuată mai rapid în Transact-SQL folosind comanda

Cu toate acestea, există o serie de diferențe în implementarea comenzii TRONCIARE TABELĂ comparativ cu utilizarea operatorului ȘTERGE lucruri de reținut:

1. Ștergerea rândurilor individuale de tabel nu este înregistrată. Jurnalul înregistrează doar lansarea paginilor care au fost ocupate de date din tabel.
2. Declanșatoarele nu funcționează, în special declanșatorul de ștergere.
3. Comanda nu este aplicabilă dacă aceasta masa există o referință prin cheie străină și chiar dacă cheia străină are o opțiune de ștergere în cascadă.
4. Valoarea contorului ( IDENTITATE) este resetat la valoarea inițială.

Exemplu . Trebuie scos de pe masă Laptop toate notebook-urile PC cu o dimensiune a ecranului mai mică de 12 inchi.

TRUNCATE 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 [ ,...n ] ]ȘTERGE [ TOP (expresie) [ PERCENT ] ][ FROM ] ( ( alias_tabel | | rowset_function_limited [ CU (table_hint_limited [ ...n ] ) ]) | @table_variable) [ ] [ FROM table_source [ ,...n ] ] [ UNDE ( | { [ CURRENT OF ( ( [ GLOBAL ] cursor_name ) | cursor_variable_name ) ] } } ] [ OPȚIUNE ( [ ,...n ] ) ] [; ] ::= { [ nume_server.nume_bază de date.nume_schemă. | numele bazei de date. [nume_schemă]. | nume_schemă. ] table_or_view_name)

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 și eliminați rândurile corespunzătoare din tabel din prima propoziție.

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 ( [ , ... n] )
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.

Acțiune
Copyright 2024. shongames.ru. Android. Sistem de operare. Multimedia. Rețelele de socializare. Instrumente. Codec-uri. Arte grafice. Toate drepturile rezervate.