Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Най-добрите начини за използване на SQL DELETE оператор в SQL таблица

В релационните бази данни създаваме таблици за съхраняване на данни в различни формати. SQL Server съхранява данни във формат на редове и колони, които съдържат стойност, свързана с всеки тип данни. Когато проектираме SQL таблици, ние дефинираме типове данни като цяло число, плаващо число, десетично число, varchar и bit. Например, таблица, която съхранява данни за клиенти, може да има полета като име на клиент, имейл, адрес, щат, държава и т.н. Различни SQL команди се изпълняват върху SQL таблица и могат да бъдат разделени в следните категории:

  • Език за дефиниране на данни (DDL):  Тези команди се използват за създаване и модифициране на обекти на база данни в база данни.
    • Създаване:  Създава обекти
    • Промяна:  Променя обекти
    • Изпускане:  Изтрива обекти
    • Отрязване:  Изтрива всички данни от таблица
  • Език за манипулиране на данни (DML):  Тези команди вмъкват, извличат, променят, изтриват и актуализират данни в базата данни.
    • Изберете:  Извлича данни от една или няколко таблици
    • Вмъкване:  Добавя нови данни в таблица
    • Актуализация:  Променя съществуващите данни
    • Изтриване:  Изтрива съществуващи записи в таблица

  • Език за управление на данните (DCL):  Тези команди са свързани с контроли за права или разрешения в база данни.
    • Предоставяне:  Присвоява разрешения на потребител
    • Отмяна:  Отменя разрешенията от потребител
  • Език за управление на транзакциите (TCL):  Тези команди контролират транзакциите в база данни.
    • Отвързване:  Запазва направените от заявката промени
    • Отмяна: Връща обратно изрична или неявна транзакция до началото на транзакцията или до точка на запис вътре в транзакцията
    • Запазване на транзакции:  Задава точка за запис или маркер в рамките на транзакция

Да предположим, че имате данни за клиентски поръчки, съхранени в SQL таблица. Ако продължите да вмъквате данни в тази таблица непрекъснато, таблицата може да съдържа милиони записи, което би причинило проблеми с производителността във вашите приложения. Поддръжката на вашия индекс също може да отнеме много време. Често не е необходимо да запазвате поръчки, които са по-стари от три години. В тези случаи можете да изтриете тези записи от таблицата. Това ще спести място за съхранение, както и ще намали усилията ви за поддръжка.

Можете да премахнете данни от SQL таблица по два начина:

  • Използване на SQL израз за изтриване
  • Използване на съкращаване

Ще разгледаме разликата между тези SQL команди по-късно. Нека първо проучим оператора за изтриване на SQL.

Изтриване на SQL без никакви условия

В изразите на езика за манипулиране на данни (DML), SQL оператор за изтриване премахва редовете от таблица. Можете да изтриете конкретен ред или всички редове. Основният израз за изтриване не изисква никакви аргументи.

Нека създадем SQL таблица за поръчки с помощта на скрипта по-долу. Тази таблица има три колони [OrderID], [ProductName] и [ProductQuantity].

Create Table Orders (   OrderID int, ProductName varchar(50), ProductQuantity int )

Вмъкнете няколко записа в тази таблица.

Insert into Orders values (1,'ABC books',10), (2,'XYZ',100), (3,'SQL book',50)

Да предположим, че искаме да изтрием данните от таблицата. Можете да посочите името на таблицата за премахване на данни, като използвате оператора delete. И двата SQL оператора са еднакви. Можем да посочим името на таблицата от (по избор) ключова дума или да посочим името на таблицата директно след изтриването.

Delete Orders Go Delete from Orders GO

Изтриване на SQL с филтрирани данни

Тези SQL изрази за изтриване изтриват всички данни на таблицата. Обикновено не премахваме всички редове от SQL таблица. За да премахнем конкретен ред, можем да добавим клауза where с оператора delete. Клаузата where съдържа критериите за филтриране и в крайна сметка определя кой ред(ове) да се премахне.

Да предположим например, че искаме да премахнем идентификатор на поръчка 1. След като добавим клауза where, SQL Server първо проверява съответните редове и премахва тези конкретни редове.
Delete Orders where orderid=1

Ако условието на клаузата where е невярно, то не премахва никакви редове. Например, премахнахме поръчания 1 от таблицата с поръчки. Ако изпълним оператора отново, той не намира редове, които да удовлетворят условието на клаузата where. В този случай връща 0 засегнати реда.

Изявление за изтриване на SQL и клауза TOP

Можете да използвате оператора TOP, за да изтриете и редовете. Например заявката по-долу изтрива първите 100 реда от таблицата „Поръчки“.

Delete top (100) [OrderID] from Orders

Тъй като не сме посочили никакъв „ORDER BY“, той избира произволни редове и ги изтрива. Можем да използваме клаузата Order by, за да сортираме данните и да изтрием горните редове. В заявката по-долу сортира [OrderID] в низходящ ред и след това го изтрива от таблицата [Orders].

Delete from Orders where [OrderID] In ( Select top 100 [OrderID] FROM Orders order by [OrderID] Desc )

Изтриване на редове въз основа на друга таблица

Понякога трябва да изтрием редове въз основа на друга таблица. Тази таблица може да съществува в същата база данни или не.

  • Търсене в таблица

Можем да използваме метода за търсене на таблица или SQL присъединяване, за да изтрием тези редове. Например, искаме да изтрием редове от таблицата [Поръчки], които отговарят на следното условие:

Трябва да има съответни редове в таблицата [dbo].[Customer].

Вижте заявката по-долу, тук имаме оператор select в клаузата where на оператора за изтриване. SQL Server първо получава редовете, които отговарят на оператора select, и след това премахва тези редове от таблицата [Поръчки] с помощта на оператора SQL delete.

Delete Orders where orderid in (Select orderid  from Customer)
  • Присъединяване към SQL

Като алтернатива можем да използваме SQL съединения между тези таблици и да премахнем редовете. В долната заявка свързваме таблиците [Поръчки]] с таблицата [Клиент]. SQL присъединяването винаги работи върху обща колона между таблиците. Имаме колона [OrderID], която свързва двете таблици заедно.

DELETE Orders FROM Orders o INNER JOIN Customer c ON o.orderid=c.orderid

За да разберете горния израз за изтриване, нека разгледаме действителния план за изпълнение.

Съгласно плана за изпълнение, той извършва сканиране на таблицата и на двете таблици, получава съвпадащите данни и ги изтрива от таблицата с поръчки.

  • Общ табличен израз (CTE)

Можем да използваме общ израз на таблица (CTE), за да изтрием редовете и от SQL таблица. Първо, ние дефинираме CTE, за да намерим реда, който искаме да премахнем.

След това присъединяваме CTE към SQL таблицата Orders и изтриваме редовете.

WITH cteOrders AS (SELECT OrderID FROM Customer WHERE CustomerID = 1 ) DELETE Orders FROM cteOrders sp INNER JOIN dbo.Orders o ON o.orderid = sp.orderid;

Въздействие върху обхвата на идентичността

Колоните за идентичност в SQL Server генерират уникални, последователни стойности за вашата колона. Те се използват главно за уникално идентифициране на ред в SQL таблицата. Колоната с първичен ключ също е добър избор за клъстериран индекс в SQL Server.

В скрипта по-долу имаме таблица [Служител]. Тази таблица има идентификационен номер на колона за идентичност.

Create Table Employee ( id int identity(1,1), [Name] varchar(50) )

Вмъкнахме 50 записа в тази таблица, които генерираха стойностите на идентичността за колоната id.

Declare @id int=1 While(@id<=50) BEGIN Insert into Employee([Name]) values('Test'+CONVERT(VARCHAR,@ID)) Set @id=@id+1 END

Ако изтрием няколко реда от SQL таблицата, това не нулира стойностите на идентичността за следващите стойности. Например, нека изтрием няколко реда, които имат стойности на идентичност от 20 до 25.

Delete from employee where id between 20 and 25

Сега вижте записите в таблицата.

Select * from employee where id>15

Показва разликата в диапазона на стойностите на идентичността.

SQL оператор за изтриване и регистър на транзакциите

SQL изтриването регистрира всяко изтриване на ред в регистъра на транзакциите. Да предположим, че трябва да изтриете милиони записи от SQL таблица. Не искате да изтривате голям брой записи в една транзакция, защото това може да доведе до експоненциално нарастване на вашия регистрационен файл и също така вашата база данни може да бъде недостъпна. Ако анулирате транзакция по средата, може да отнеме часове, за да върнете обратно изявление за изтриване.

В този случай винаги трябва да изтривате редове на малки парчета и да ги записвате редовно. Например, можете да изтриете партида от 10 000 реда наведнъж, да я извършите и да преминете към следващата партида. Когато SQL Server фиксира парчето, нарастването на регистрационния файл на транзакциите може да се контролира.

 Най-добри практики

  • Винаги трябва да правите резервно копие, преди да изтриете данни.
  • По подразбиране SQL Server използва неявни транзакции и записва записите, без да пита потребителя. Като най-добра практика трябва да започнете изрична транзакция, като използвате Begin Transaction. Той ви дава контрола за извършване или връщане на транзакцията. Трябва също така да изпълнявате често архивиране на регистрационните файлове на транзакциите, ако вашата база данни е в режим на пълно възстановяване.
  • Искате да изтриете данни на малки парчета, за да избегнете прекомерното използване на регистрационния файл на транзакциите. Освен това избягва блокирането и за други SQL транзакции.
  • Трябва да ограничите разрешенията, така че потребителите да не могат да изтриват данни. Само оторизираните потребители трябва да имат достъп за премахване на данни от SQL таблица.
  • Искате да изпълните оператора за изтриване с клауза where. Той премахва филтрирани данни от SQL таблица. Ако приложението ви изисква често изтриване на данни, добра идея е периодично да нулирате стойностите на самоличността. В противен случай може да се сблъскате с проблеми с изчерпването на стойността на идентичността.
  • В случай, че искате да изпразните таблицата, препоръчително е да използвате израза truncate. Инструкцията truncate премахва всички данни от таблица, използва минимално регистриране на транзакции, нулира диапазона на стойностите на идентичността и е по-бърз от оператора за изтриване на SQL, тъй като незабавно освобождава всички страници за таблицата.
  • В случай, че използвате ограничения на външния ключ (отношение родител-дъще) за вашите таблици, трябва да изтриете реда от дъщерния ред и след това от родителската таблица. Ако изтриете реда от родителския ред, можете също да използвате опцията каскадно изтриване, за да изтриете автоматично реда от дъщерна таблица. Можете да се обърнете към статията: Изтриване на каскада и актуализиране на каскада във външния ключ на SQL Server за допълнителна информация.
  • Ако използвате оператора top, за да изтриете редовете, SQL Server изтрива редовете произволно. Винаги трябва да използвате най-горната клауза със съответната клауза Order by и Group by.
  • Дирекцията за изтриване придобива изключително заключване на намерение върху референтната таблица; следователно през това време никакви други транзакции не могат да променят данните. Можете да използвате NOLOCK подсказка, за да прочетете данните.
  • Трябва да избягвате използването на подсказката за таблицата, за да отмените поведението на заключване по подразбиране на оператора за изтриване на SQL; трябва да се използва само от опитни администратори на база данни и разработчици.

Важни съображения

Има много предимства от използването на SQL изрази за изтриване за премахване на данни от SQL таблица, но както можете да видите, това изисква методичен подход. Важно е винаги да изтривате данни на малки партиди и да действате с повишено внимание, когато изтривате данни от производствен екземпляр. Наличието на стратегия за архивиране за възстановяване на данни за минимално време е задължително, за да се избегне престой или бъдещо въздействие върху производителността.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да замените всички появявания на низ с друг низ в SQL Server – REPLACE()

  2. Архивно шифроване на база данни на SQL Server

  3. Какъв е най-добрият начин за показване на изображение от база данни на sql сървър в asp.net?

  4. Какво е значението на 1/1/1753 в SQL Server?

  5. Как да получите резултат с плаваща стойност, като разделите две цели числа с помощта на T-SQL?