Удаление строк с помощью инструкции 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
См. также