Как удалить строки из таблицы sql
Время от времени возникает задача удаления записей из таблицы. Для этого в SQL предусмотрены операторы DELETE и TRUNCATE , из которых наиболее универсальным и безопасным является первый вариант.
MySQLDELETE FROM имя_таблицы [WHERE условие_отбора_записей];Если условие отбора записей WHERE отсутствует, то будут удалены все записи указанной таблицы.
Эту же операцию (удаления всех записей) можно сделать также с помощью оператора TRUNCATE . Он выполнит удаление таблицы и пересоздаст её заново - этот вариант работает гораздо быстрее, чем удаление всех записей одна за другой (как в случае с DELETE ) особенно для больших таблиц.
MySQLTRUNCATE TABLE имя_таблицы;Оптимизатор запросов СУБД MySQL автоматически использует оператор TRUNCATE , если оператор DELETE не содержит условия WHERE или конструкции LIMIT .
Однако у оператора TRUNCATE есть ряд отличий:
- Не срабатывают триггеры, в частности, триггер удаления
- Удаляет все строки в таблице, не записывая при этом удаление отдельных строк данных в журнал транзакций
- Сбрасывает счётчик идентификаторов до начального значения
- Чтобы использовать, необходимы права на изменение таблицы
Если в DELETE запросе используется JOIN , то необходимо указать из каких(ой) именно таблиц(ы) требуется удалять записи.
MySQLDELETE имя_таблицы_1 [, имя_таблицы_2] FROM имя_таблицы_1 JOIN имя_таблицы_2 ON имя_таблицы_1.поле = имя_таблицы_2.поле [WHERE условие_отбора_записей];Например, нам необходимо удалить все бронирования жилья, в котором отсутствует кухня. Тогда запрос будет выглядеть следующим образом:
MySQLDELETE Reservations FROM Reservations JOIN Rooms ON Reservations.room_id = Rooms.id WHERE Rooms.has_kitchen = false;Если бы, помимо удаления бронирования, нам нужно было также удалить и жилье, то запрос приобрёл бы следующий вид:
MySQLDELETE Reservations, Rooms FROM Reservations JOIN Rooms ON Reservations.room_id = Rooms.id WHERE Rooms.has_kitchen = false;Оператор DELETE стр. 1
Оператор DELETE удаляет строки из временных или постоянных базовых таблиц, представлений или курсоров, причем в двух последних случаях действие оператора распространяется на те базовые таблицы, из которых извлекались данные в эти представления или курсоры. Оператор удаления имеет простой синтаксис:
Если предложение WHERE отсутствует, удаляются все строки из таблицы или представления (представление должно быть обновляемым). Более быстро эту операцию (удаление всех строк из таблицы) можно в Transact-SQL (T-SQL) — процедурное расширение языка SQL, используемое для программирования на стороне сервера в Microsoft SQL Server и Sybase ASE. Transact-SQL также выполнить с помощью команды
Однако есть ряд особенностей в реализации команды TRUNCATE TABLE , которые следует иметь в виду:
- не журнализируется удаление отдельных строк таблицы; в журнал записывается только освобождение страниц, которые были заняты данными таблицы;
- не отрабатывают триггеры, в частности, триггер на удаление;
- команда неприменима, если на данную таблицу имеется ссылка по внешнему ключу, и даже если внешний ключ имеет опцию каскадного удаления.
- значение счетчика ( IDENTITY ) сбрасывается в начальное значение.
Требуется удалить из таблицы Laptop все портативные компьютеры с размером экрана менее 12 дюймов.
Все блокноты можно удалить с помощью оператора
Transact-SQL расширяет синтаксис оператора DELETE , вводя дополнительное предложение FROM :
При помощи источника табличного типа можно конкретизировать данные, удаляемые из таблицы в первом предложении FROM .
При помощи этого предложения можно выполнять соединения таблиц, что логически заменяет использование подзапросов в предложении WHERE для идентификации удаляемых строк. Поясним сказанное на примере.
Пусть требуется удалить те модели ПК из таблицы Product, для которых нет соответствующих строк в таблице PC.
Используя стандартный синтаксис, эту задачу можно решить следующим запросом:
Заметим, что предикат type = 'pc' необходим здесь, чтобы не были удалены также модели принтеров и портативных компьютеров.
Эту же задачу можно решить с помощью дополнительного предложения FROM следующим образом:
Здесь применяется внешнее соединение, в результате чего столбец PC.model для моделей ПК, отсутствующих в таблице PC, будет содержать NULL -значение, что и используется для идентификации подлежащих удалению строк.
Страницы: 1 2 3 Практическое руководство. Как удалить строки из базы данных
Вы можете удалить строки в базе данных, удалив соответствующие объекты LINQ to SQL из коллекции, связанной с таблицами. LINQ to SQL преобразует изменения в соответствующие команды SQL DELETE .
LINQ to SQL не поддерживает и не распознает операции каскадного удаления. Если требуется удалить строку в таблице, имеющей ограничения, необходимо выполнить любую из следующих задач.
- Установите правило ON DELETE CASCADE в ограничении внешнего ключа в базе данных.
- Используйте собственный код, чтобы сначала удалить дочерние объекты, не допускающие удаление родительского объекта.
В противном случае создается исключение. См. второй пример кода далее в этом разделе.
Вы можете переопределить LINQ to SQL методы по умолчанию для Insert операций с базой данных , Update и Delete . Дополнительные сведения см. в разделе Настройка операций вставки, обновления и удаления.
Разработчики, использующие Visual Studio, могут использовать реляционный конструктор объектов для разработки хранимых процедур с той же целью.
В следующих шагах предполагается, что подключение к базе данных Northwind выполняется с помощью допустимого объекта DataContext. Дополнительные сведения см. в разделе Практическое руководство. Подключение к базе данных.
Удаление строки в базе данных
- Отправьте в базу данных запрос на удаляемую строку.
- Вызовите метод DeleteOnSubmit.
- Отправьте изменение в базу данных.
Пример 1
В первом примере кода в базу данных отправляется запрос на сведения о заказе "Order #11000", помечаются сведения для удаления, а изменения отправляются в базу данных.
// Query the database for the rows to be deleted. var deleteOrderDetails = from details in db.OrderDetails where details.OrderID == 11000 select details; foreach (var detail in deleteOrderDetails) < db.OrderDetails.DeleteOnSubmit(detail); >try < db.SubmitChanges(); >catch (Exception e) < Console.WriteLine(e); // Provide for exceptions. >' Query the database for the rows to be deleted. Dim deleteOrderDetails = _ From details In db.OrderDetails() _ Where details.OrderID = 11000 _ Select details For Each detail As OrderDetail In deleteOrderDetails db.OrderDetails.DeleteOnSubmit(detail) Next Try db.SubmitChanges() Catch ex As Exception Console.WriteLine(ex) ' Provide for exceptions End TryПример 2
Целью второго примера является удаление заказа (с номером 10250). Код сначала проверяет таблицу OrderDetails на наличие в ней дочерних элементов удаляемого заказа. Если в таблице есть дочерние элементы заказа, сначала они, а затем сам заказ помечаются для удаления. DataContext располагает фактические действия по удалению в надлежащей последовательности, чтобы команды удаления, отправляемые в базу данных, подчинялись ее ограничениям.
Northwnd db = new Northwnd(@"c:\northwnd.mdf"); db.Log = Console.Out; // Specify order to be removed from database int reqOrder = 10250; // Fetch OrderDetails for requested order. var ordDetailQuery = from odq in db.OrderDetails where odq.OrderID == reqOrder select odq; foreach (var selectedDetail in ordDetailQuery) < Console.WriteLine(selectedDetail.Product.ProductID); db.OrderDetails.DeleteOnSubmit(selectedDetail); >// Display progress. Console.WriteLine("detail section finished."); Console.ReadLine(); // Determine from Detail collection whether parent exists. if (ordDetailQuery.Any()) < Console.WriteLine("The parent is present in the Orders collection."); // Fetch Order. try < var ordFetch = (from ofetch in db.Orders where ofetch.OrderID == reqOrder select ofetch).First(); db.Orders.DeleteOnSubmit(ordFetch); Console.WriteLine("OrderID is marked for deletion.", ordFetch.OrderID); > catch (Exception e) < Console.WriteLine(e.Message); Console.ReadLine(); >> else < Console.WriteLine("There was no parent in the Orders collection."); >// Display progress. Console.WriteLine("Order section finished."); Console.ReadLine(); try < db.SubmitChanges(); >catch (Exception e) < Console.WriteLine(e.Message); Console.ReadLine(); >// Display progress. Console.WriteLine("Submit finished."); Console.ReadLine();Dim db As New Northwnd("c:\northwnd.mdf") db.Log = Console.Out ' Specify order to be removed from database. Dim reqOrder As Integer = 10252 ' Fetch OrderDetails for requested order. Dim ordDetailQuery = _ From odq In db.OrderDetails _ Where odq.OrderID = reqOrder _ Select odq For Each selectedDetail As OrderDetail In ordDetailQuery Console.WriteLine(selectedDetail.Product.ProductID) db.OrderDetails.DeleteOnSubmit(selectedDetail) Next ' Display progress. Console.WriteLine("Detail section finished.") Console.ReadLine() ' Determine from Detail collection whether parent exists. If ordDetailQuery.Any Then Console.WriteLine("The parent is present in the Orders collection.") ' Fetch order. Try Dim ordFetch = _ (From ofetch In db.Orders _ Where ofetch.OrderID = reqOrder _ Select ofetch).First() db.Orders.DeleteOnSubmit(ordFetch) Console.WriteLine(" OrderID is marked for deletion.,", ordFetch.OrderID) Catch ex As Exception Console.WriteLine(ex.Message) Console.ReadLine() End Try Else Console.WriteLine("There was no parent in the Orders collection.") End If ' Display progress. Console.WriteLine("Order section finished.") Console.ReadLine() Try db.SubmitChanges() Catch ex As Exception Console.WriteLine(ex.Message) Console.ReadLine() End Try ' Display progress. Console.WriteLine("Submit finished.") Console.ReadLine()См. также раздел
- Практическое руководство. Как управлять конфликтами изменений
- Практическое руководство. Назначение хранимых процедур для выполнения обновления, вставки и удаления (реляционный конструктор объектов)
- Внесение и отправка изменений данных
Как удалить строки из таблицы sql
Для удаления применяется команда DELETE :
DELETE [FROM] имя_таблицы WHERE условие_удаленияНапример, удалим строки, у которых id равен 9:
DELETE Products WHERE >Или удалим все товары, производителем которых является Xiaomi и которые имеют цену меньше 15000:DELETE Products WHERE Manufacturer='Xiaomi' AND Price < 15000Более сложный пример - удалим первые два товара, у которых производитель - Apple:
DELETE Products FROM (SELECT TOP 2 * FROM Products WHERE Manufacturer='Apple') AS Selected WHERE Products.Id = Selected.IdПосле первого оператора FROM идет выборка двух строк из таблицы Products. Этой выборке назначается псевдоним Selected с помощью оператора AS. Далее устанавливаем условие, что если Id в таблице Products имеет то же значение, что и Id в выборке Selected, то строка удаляется.
Если необходимо вовсе удалить все строки вне зависимости от условия, то условие можно не указывать:

