Инструменты пользователя

Инструменты сайта


delete

Оператор DELETE

удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:

1.    DELETE FROM <имя таблицы>
2.    [WHERE <предикат>];

Если предложение WHERE отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) можно в Transact-SQL также выполнить с помощью команды

1.   TRUNCATE TABLE <имя таблицы>

Однако есть ряд особенностей в реализации команды TRUNCATE TABLE, которые следует иметь в виду:

  • Элемент ненумерованного спискане журнализируется удаление отдельных строк таблицы; в журнал записывается только освобождение страниц, которые были заняты данными таблицы;
  • не отрабатывают триггеры, в частности, триггер на удаление;
  • команда неприменима, если на данную таблицу имеется ссылка по внешнему ключу, и даже если внешний ключ имеет опцию каскадного удаления.
  • значение счетчика (IDENTITY) сбрасывается в начальное значение.

Пример

Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 12 дюймов.

1.    DELETE FROM Laptop
2.    WHERE screen < 12;

Все блокноты можно удалить с помощью оператора

1.    DELETE FROM Laptop;

или

1.    TRUNCATE TABLE Laptop;

Transact-SQL расширяет синтаксис оператора DELETE, вводя дополнительное предложение FROM:

FROM <источник табличного типа>

При помощи источника табличного типа можно конкретизировать данные, удаляемые из таблицы в первом предложении FROM.

При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении WHERE для идентификации удаляемых строк. Поясним сказанное на примере.

Пример Пусть требуется удалить те модели ПК из таблицы Product, для которых нет соответствующих строк в таблице PC. Используя стандартный синтаксис, эту задачу можно решить следующим запросом:

1.    DELETE FROM Product 
2.    WHERE type = 'pc' AND 
3.    model NOT IN (SELECT model 
4.    FROM PC
5.    );

Заметим, что предикат type = 'pc' необходим здесь, чтобы не были удалены также модели принтеров и портативных компьютеров.

Эту же задачу можно решить с помощью дополнительного предложения FROM следующим образом:

1.    DELETE FROM Product 
2.    FROM Product pr LEFT JOIN 
3.    PC ON pr.model = PC.model 
4.    WHERE type = 'pc' AND 
5.    PC.model IS NULL;

Здесь применяется внешнее соединение, в результате чего столбец PC.model для моделей ПК, отсутствующих в таблице PC, будет содержать NULL-значение, что и используется для идентификации подлежащих удалению строк.

Оператор TRUNCATE TABLE

Как отмечалось выше, при выполнении этой команды значение счетчика (IDENTITY) сбрасывается в начальное значение. Давайте проверим это утверждение в MS SQL Server. Для начала создадим таблицу с автоинкрементируемым столбцом, и добавим в нее три строки.

1.    CREATE TABLE Truncate_test (id INT IDENTITY(5,5) PRIMARY KEY, val INT);
2.    GO
3.    INSERT INTO Truncate_test(val) 
4.    VALUES (1),(2),(3);
5.    SELECT * FROM Truncate_test;
6.    GO
delete.txt · Последнее изменение: 2021/01/31 11:34 — dja