Поделиться через


Удаление строк с помощью инструкции DELETE

Инструкция DELETE удаляет одну или несколько строк из таблицы или представления.

Упрощенный синтаксис инструкции DELETE имеет следующий вид.

DELETE table_or_view

FROM table_sources

WHERE search_condition

Аргумент table_or_view перечисляет таблицы или представления, из которых нужно удалить строки. Удаляются все строки из таблицы или представления table_or_view, которые соответствуют заданным в предложении WHERE условиям поиска. Если предложение WHERE не указано, удаляются все строки в таблице или представлении table_or_view. Предложение FROM задает дополнительные таблицы или представления и условия соединения, которые могут быть использованы предикатами в условиях поиска предложения WHERE для определения строк, подлежащих удалению из таблицы или представления table_or_view. Строки не удаляются из таблиц, перечисленных в предложении FROM, а только из таблицы, указанной в table_or_view.

Таблица, из которой удалены все строки, остается в базе данных. Инструкция DELETE удаляет только строки из таблицы; таблица должна быть удалена из базы данных с помощью инструкции DROP TABLE.

Удаление строк из кучи

Если строки удаляются из кучи, Database Engine может использовать для этой операции блокировку строки или страницы. В результате пустые страницы, в которых выполняются операции удаления, остаются размещенными для кучи. Если их не освободить, занимаемое ими место не может быть использовано под другие объекты базы данных.

Чтобы удалить из кучи строки и освободить страницы, воспользуйтесь одним из следующих методов.

  • Задайте подсказку TABLOCK в инструкции DELETE. Это приведет к тому, что при выполнении операции удаления в таблице будет установлена совмещаемая блокировка, а не блокировка строки или страницы, что позволит освободить страницы. Дополнительные сведения о подсказке TABLOCK см. в разделе Табличные подсказки (Transact-SQL).

  • Если из таблицы удаляются все строки, пользуйтесь инструкцией TRUNCATE TABLE.

  • Перед удалением строк создайте в куче кластеризованный индекс. Потом его можно будет удалить. Этот метод потребует больше времени и потребляет больше временных ресурсов.

Дополнительные сведения о блокировках см. в разделе Блокировка в компоненте Database Engine.

Примеры

Следующий пример удаляет все строки таблицы SalesPersonQuotaHistory, так как не указано предложение WHERE, ограничивающее количество удаляемых строк.

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

Следующий пример удаляет все строки таблицы ProductCostHistory, у которых значение в столбце StandardCost превышает 1000.00.

USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

Следующий пример показывает использование расширения Transact-SQL для удаления записей из базовой таблицы, основанной на соединяющих или коррелирующих вложенных запросах. Первая инструкция DELETE показывает основанное на вложенных запросах решение, совместимое с ISO, а вторая инструкция DELETE показывает использование расширения языка Transact-SQL. Оба запроса удаляют строки из таблицы SalesPersonQuotaHistory, основанной на сведениях о продажах за текущий год, хранящихся в таблице SalesPerson.

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO