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

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


delete

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
delete [2021/01/31 10:54]
dja
delete [2021/01/31 11:34] (текущий)
dja [Оператор TRUNCATE TABLE]
Строка 1: Строка 1:
-Оператор **DELETE** удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:+===== Оператор DELETE ===== 
 +удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:
 <code> <code>
-1.    DELETE FROM <имя таблицы > +1.    DELETE FROM <имя таблицы>
 2.    [WHERE <предикат>]; 2.    [WHERE <предикат>];
 +
 </code> </code>
 +
 Если предложение **WHERE** отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) можно в [[http://www.sql-tutorial.ru/ru/termins/tsql.html|Transact-SQL]] также выполнить с помощью команды Если предложение **WHERE** отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) можно в [[http://www.sql-tutorial.ru/ru/termins/tsql.html|Transact-SQL]] также выполнить с помощью команды
 <code> <code>
 +
 1.   TRUNCATE TABLE <имя таблицы> 1.   TRUNCATE TABLE <имя таблицы>
 +
 </code> </code>
  
 +Однако есть ряд особенностей в реализации команды **TRUNCATE TABLE**, которые следует иметь в виду:
 +
 +   * Элемент ненумерованного спискане журнализируется удаление отдельных строк таблицы; в журнал записывается только освобождение страниц, которые были заняты данными таблицы;
 +
 +  * не отрабатывают триггеры, в частности, триггер на удаление;
 +
 +  * команда неприменима, если на данную таблицу имеется ссылка по внешнему ключу, и даже если внешний ключ имеет опцию каскадного удаления.
 +
 +  * значение счетчика **(IDENTITY)**  сбрасывается в начальное значение.
 +
 +**Пример**
 +
 +<font inherit/inherit;;#2980b9;;inherit>**Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 12 дюймов.**</font>
 +
 +<code>
 +1.    DELETE FROM Laptop
 +2.    WHERE screen < 12;
 +</code>
 +
 +Все блокноты можно удалить с помощью оператора
 +
 +<code>
 +1.    DELETE FROM Laptop;
 +</code>
 +или
 +<code>
 +1.    TRUNCATE TABLE Laptop;
 +</code>
 +Transact-SQL расширяет синтаксис оператора **DELETE**, вводя дополнительное предложение **FROM**:
 +<code>
 +FROM <источник табличного типа>
 +</code>
 +При помощи источника табличного типа можно конкретизировать данные, удаляемые из таблицы в первом предложении **FROM**.
 +
 +При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении **WHERE** для идентификации удаляемых строк. Поясним сказанное на примере. 
 +
 +**Пример**
 +<color #7092be>**Пусть требуется удалить те модели ПК из таблицы Product, для которых нет соответствующих строк в таблице PC.**</color> 
 +Используя стандартный синтаксис, эту задачу можно решить следующим запросом:
 +<code>
 +1.    DELETE FROM Product 
 +2.    WHERE type = 'pc' AND 
 +3.    model NOT IN (SELECT model 
 +4.    FROM PC
 +5.    );
 +</code>
 +Заметим, что предикат type = 'pc' необходим здесь, чтобы не были удалены также модели принтеров и портативных компьютеров.
 +
 +Эту же задачу можно решить с помощью дополнительного предложения **FROM** следующим образом:
 +<code>
 +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;
 +</code>
 +Здесь применяется внешнее соединение, в результате чего столбец PC.model для моделей ПК, отсутствующих в таблице PC, будет содержать **NULL**-значение, что и используется для идентификации подлежащих удалению строк.
 + 
 +===== Оператор TRUNCATE TABLE =====
 +
 +Как отмечалось выше, при выполнении этой команды значение счетчика (IDENTITY) сбрасывается в начальное значение. Давайте проверим это утверждение в MS SQL Server. Для начала создадим таблицу с автоинкрементируемым столбцом, и добавим в нее три строки.
 +<code>
 +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
 +</code>
delete.1612079648.txt.gz · Последнее изменение: 2021/01/31 10:54 — dja