Как удалить строку из таблицы sql через c
Перейти к содержимому

Как удалить строку из таблицы sql через c

  • автор:

Практическое руководство. Как удалить строки из базы данных

Вы можете удалить строки в базе данных, удалив соответствующие объекты LINQ to SQL из коллекции, связанной с таблицами. LINQ to SQL преобразует изменения в соответствующие команды SQL DELETE .

LINQ to SQL не поддерживает и не распознает операции каскадного удаления. Если требуется удалить строку в таблице, имеющей ограничения, необходимо выполнить любую из следующих задач.

  • Установите правило ON DELETE CASCADE в ограничении внешнего ключа в базе данных.
  • Используйте собственный код, чтобы сначала удалить дочерние объекты, не допускающие удаление родительского объекта.

В противном случае создается исключение. См. второй пример кода далее в этом разделе.

Вы можете переопределить LINQ to SQL методы по умолчанию для Insert операций с базой данных , Update и Delete . Дополнительные сведения см. в разделе Настройка операций вставки, обновления и удаления.

Разработчики, использующие Visual Studio, могут использовать реляционный конструктор объектов для разработки хранимых процедур с той же целью.

В следующих шагах предполагается, что подключение к базе данных Northwind выполняется с помощью допустимого объекта DataContext. Дополнительные сведения см. в разделе Практическое руководство. Подключение к базе данных.

Удаление строки в базе данных

  1. Отправьте в базу данных запрос на удаляемую строку.
  2. Вызовите метод DeleteOnSubmit.
  3. Отправьте изменение в базу данных.

Пример 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() 

См. также раздел

  • Практическое руководство. Как управлять конфликтами изменений
  • Практическое руководство. Назначение хранимых процедур для выполнения обновления, вставки и удаления (реляционный конструктор объектов)
  • Внесение и отправка изменений данных

DELETE (Transact-SQL)

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

Синтаксис

-- Syntax for SQL Server and Azure SQL Database [ WITH [ . n ] ] DELETE [ TOP ( expression ) [ PERCENT ] ] [ FROM ] < < table_alias | | rowset_function_limited [ WITH ( table_hint_limited [ . n ] ) ] > | @table_variable > [ ] [ FROM table_source [ . n ] ] [ WHERE < | < [ CURRENT OF < < [ GLOBAL ] cursor_name >| cursor_variable_name > ] > > ] [ OPTION ( [ . n ] ) ] [; ] ::=
-- Syntax for Azure Synapse Analytics and Microsoft Fabric [ WITH [ . n ] ] DELETE [database_name . [ schema ] . | schema. ] table_name FROM [database_name . [ schema ] . | schema. ] table_name JOIN >[ . n ] ON [ WHERE ] [ OPTION ( [ . n ] ) ] [; ] ::= < [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias [ ] | derived_table [ AS ] table_alias [ ( column_alias [ . n ] ) ] > 
-- Syntax for Parallel Data Warehouse DELETE [ FROM [database_name . [ schema ] . | schema. ] table_name ] [ WHERE ] [ OPTION ( [ . n ] ) ] [; ] 

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

WITH
Задает временный именованный результирующий набор, также называемый обобщенным табличным выражением, который определяется в области действия инструкции DELETE. Результирующий набор получается из инструкции SELECT.

Обобщенные табличные выражения также можно использовать в инструкциях SELECT, INSERT, UPDATE и CREATE VIEW. Дополнительные сведения см. в статье WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]
Задает количество или процент удаляемых случайных строк. expression может быть либо числом, либо процентом от числа строк. Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются. Дополнительные сведения см. в разделе TOP (Transact-SQL).

FROM
Необязательное ключевое слово, которое можно использовать между ключевым словом DELETE и целевым аргументом table_or_view_name или rowset_function_limited.

table_alias
Псевдоним, заданный в предложении FROM table_source и представляющий таблицу или представление, строки которых будут удалены.

server_name
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Имя сервера (с использованием имени связанного сервера или функции OPENDATASOURCE в качестве имени сервера), на котором расположена таблица или представление. Если указано server_name, необходимо указать database_name и schema_name.

database_name
Имя базы данных.

schema_name
Имя схемы, которой принадлежит таблица или представление.

table_or_view_name
Имя таблицы или представления, откуда удаляются строки.

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

Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM определения представления. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).

rowset_function_limited
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Функция OPENQUERY или OPENROWSET в зависимости от возможностей поставщика.

WITH ( [. n] )
Задает одно или несколько табличных указаний, разрешенных для целевой таблицы. Ключевое слово WITH и круглые скобки обязательны. Использование ключевых слов NOLOCK и READUNCOMMITTED запрещено. Дополнительные сведения об указаниях по таблицам см. в разделе Указания по таблицам (Transact-SQL).

Возвращает удаленные строки или выражения, основанные на них, как часть операции DELETE. Предложение OUTPUT не поддерживается ни в каких инструкциях DML, направленных на представления и удаленные таблицы. Дополнительные сведения об аргументах и логике работы этого предложения см. в разделе Предложение OUTPUT (Transact-SQL).

FROM table_source
Задает дополнительное предложение FROM. Это расширение языка Transact-SQL для инструкции DELETE позволяет задавать данные из и удалять соответствующие строки из таблицы в первом предложении FROM.

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

Дополнительные сведения см. в разделе FROM (Transact-SQL).

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

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

  • Операции удаления с поиском указывают условие поиска для уточнения строк, которые будут удалены. Например, WHERE column_name = value.
  • Операции удаления по позиции используют предложение CURRENT OF для указания курсора. Удаление осуществляется в текущей позиции курсора. Эта операция может быть более точной, чем инструкция DELETE по найденному, которая использует предложение WHERE search_condition для указания удаляемых строк. Инструкция DELETE по найденному удаляет несколько строк, если условие поиска не определяет уникально одну строку.

Указывает ограничивающие условия для удаляемых строк. Количество предикатов, которое может содержать условие поиска, не ограничено. Дополнительные сведения см. в разделе Условие поиска (Transact-SQL).

CURRENT OF
Указывает выполнение инструкции DELETE в текущей позиции указанного курсора.

Глобальные
Указывает, что аргумент cursor_name ссылается на глобальный курсор.

cursor_name
Имя открытого курсора, из которого производится выборка. Если существует как глобальный, так и локальный курсор с именем cursor_name, этот аргумент ссылается на глобальный курсор, если указан аргумент GLOBAL, в противном случае он ссылается на локальный курсор. Курсор должен позволять производить обновления.

cursor_variable_name
Имя переменной курсора. Переменная курсора должна содержать ссылку на курсор, обновления которого разрешены.

OPTION ( [ ,. n] )
Ключевые слова, которые указывают, какие указания оптимизатора применяются при настройке способа обработки инструкции ядром СУБД. Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).

Рекомендации

Для удаления всех строк в таблице воспользуйтесь TRUNCATE TABLE . TRUNCATE TABLE выполняется быстрее, чем DELETE, и использует меньше системных ресурсов и ресурсов журнала транзакций. TRUNCATE TABLE имеет ограничения, например, таблица не может участвовать в репликации. Дополнительные сведения см. в разделе TRUNCATE TABLE (Transact-SQL)

Для возврата в клиентское приложение количества удаленных строк используйте функцию @@ROWCOUNT . Дополнительные сведения см. в разделе @@ROWCOUNT (Transact-SQL).

Обработка ошибок

Для DELETE можно реализовать обработку ошибок, заключив инструкцию в конструкцию TRY. CATCH .

При выполнении инструкции DELETE может возникнуть ошибка, если инструкция нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице с помощью ограничения FOREIGN KEY . Если DELETE удаляет несколько строк, и одна из удаленных строк нарушает триггер или ограничение, эта инструкция отменяется, возвращается ошибка и строки не удаляются.

Когда инструкция DELETE обнаруживает арифметическую ошибку (переполнение, деление на ноль или ошибку домена), возникающей во время оценки выражений, ядро СУБД обрабатывает эти ошибки, как если SET ARITHABORT бы задано значение ON. Оставшаяся часть пакетной операции отменяется и возвращается сообщение об ошибке.

Совместимость

Инструкцию DELETE можно использовать в тексте определяемой пользователем функции, если изменяемым объектом является табличная переменная.

При удалении строки, содержащей столбец FILESTREAM, также удаляются и связанные с ней файлы файловой системы. Базовые файлы удаляются сборщиком мусора FILESTREAM. Дополнительные сведения см. в разделе Доступ к данным FILESTREAM с помощью Transact-SQL.

В инструкции DELETE, которая прямо или косвенно ссылается на представление с определенным для него триггером INSTEAD OF , не может быть указано предложение FROM. Дополнительные сведения о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).

В настоящее время предложение FROM нельзя указать в инструкции DELETE в хранилище в Microsoft Fabric.

Ограничения

При использовании TOP с DELETE строки, на которые имеются ссылки, не упорядочиваются, а предложение ORDER BY не может быть прямо указано в этой инструкции. Если вам нужно использовать TOP для удаления строк в значимом хронологическом порядке, вы должны использовать TOP вместе с предложением ORDER BY в инструкции подзапроса. См. подраздел «Примеры» далее в этом разделе.

TOP нельзя использовать вместе с инструкцией DELETE для секционированных представлений.

Режим блокировки

По умолчанию инструкция DELETE всегда получает монопольную блокировку намерения (IX) для объекта таблицы и страниц, которые он изменяет, монопольную блокировку (X) для строк, которые он изменяет, и удерживает эти блокировки до завершения транзакции.

Если ресурс удерживается монопольной блокировкой намерения (IX), другие транзакции не могут изменять тот же набор данных. Операции считывания будут допускаться только при наличии подсказки NOLOCK или уровня изоляции незафиксированной операции чтения. Можно переопределить поведение оптимизатора запросов по умолчанию с помощью табличных подсказок на время выполнения инструкции DELETE указанием другого способа блокировки, но использовать подсказки рекомендуется только опытным разработчикам и администраторам баз данных и только при крайней необходимости. Дополнительные сведения см. в статье Указания по таблицам (Transact-SQL).

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

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

  • Задайте указания TABLOCK в инструкции DELETE. Использование TABLOCK приведет к тому, что при выполнении операции удаления будет установлена блокировка IX объекта, а не блокировка строки или страницы. что позволит освободить страницы. Дополнительные сведения об указании TABLOCK см. в разделе Табличные указания (Transact-SQL).
  • Если из таблицы удаляются все строки, пользуйтесь инструкцией TRUNCATE TABLE .
  • Перед удалением строк создайте в куче кластеризованный индекс. Потом его можно будет удалить. Этот метод потребует больше времени и потребляет больше временных ресурсов.

Пустые страницы можно удалить из кучи в любое время с помощью инструкции ALTER TABLE REBUILD .

Режим ведения журнала

Инструкция DELETE всегда полностью регистрируется в журнале.

Безопасность

Разрешения

Разрешения DELETE необходимы для целевой таблицы. Разрешения SELECT также необходимы, если инструкция содержит предложение WHERE.

Разрешения DELETE по умолчанию предоставляются членам предопределенной роли сервера sysadmin , членам предопределенных ролей баз данных db_owner и db_datawriter , а также владельцу таблицы. Члены ролей sysadmin , db_owner и db_securityadmin , а также владелец таблицы могут передавать разрешения другим пользователям.

Примеры

Категория Используемые элементы синтаксиса
Основной синтаксис DELETE
Ограничение удаляемых строк WHERE * FROM * cursor *
Удаление строк из удаленной таблицы Связанный сервер * функция набора строк OPENQUERY * функция набора строк OPENDATASOURCE
Сбор результатов для инструкции DELETE OUTPUT, предложение

Базовый синтаксис

В примерах в этом разделе описывается базовая функциональность инструкции DELETE с помощью минимального необходимого синтаксиса.

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

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

DELETE FROM Sales.SalesPersonQuotaHistory; GO 

Ограничение удаляемых строк

В примерах в этом разделе описываются способы ограничения количества удаляемых строк.

B. Использование предложения WHERE для удаления набора строк

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

DELETE FROM Production.ProductCostHistory WHERE StandardCost > 1000.00; GO 

В следующем примере показано использование более сложного предложения WHERE. Предложение WHERE определяет два условия, которые должны быть выполнены для определения удаляемых строк. Значение в столбце StandardCost должно быть в диапазоне от 12.00 до 14.00 , а значение в столбце SellEndDate должно быть равно NULL. В данном примере также выводится значение из функции @@ROWCOUNT , которое показывает количество удаленных строк.

DELETE Production.ProductCostHistory WHERE StandardCost BETWEEN 12.00 AND 14.00 AND EndDate IS NULL; PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3)); 
C. Использование курсора для определения удаляемой строки

В следующем примере удаляется одна строка из EmployeePayHistory таблицы в базе данных AdventureWorks2022 с помощью курсора с именем complex_cursor . Операция удаления затрагивает только одну строку, выбранную в данный момент курсором.

DECLARE complex_cursor CURSOR FOR SELECT a.BusinessEntityID FROM HumanResources.EmployeePayHistory AS a WHERE RateChangeDate <> (SELECT MAX(RateChangeDate) FROM HumanResources.EmployeePayHistory AS b WHERE a.BusinessEntityID = b.BusinessEntityID) ; OPEN complex_cursor; FETCH FROM complex_cursor; DELETE FROM HumanResources.EmployeePayHistory WHERE CURRENT OF complex_cursor; CLOSE complex_cursor; DEALLOCATE complex_cursor; GO 
D. Использование операторов объединения и вложенных запросов к данным в одной таблице для удаления строк в другой таблице

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

-- SQL-2003 Standard subquery DELETE FROM Sales.SalesPersonQuotaHistory WHERE BusinessEntityID IN (SELECT BusinessEntityID FROM Sales.SalesPerson WHERE SalesYTD > 2500000.00); GO 
-- Transact-SQL extension DELETE FROM Sales.SalesPersonQuotaHistory FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYTD > 2500000.00; GO 
-- No need to mention target table more than once. DELETE spqh FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID WHERE sp.SalesYTD > 2500000.00; 
Д. Ограничение числа удаляемых строк с помощью ключевого слова TOP

Если с инструкцией DELETE применяется предложение TOP (n), то операция удаления производится над n случайно выбранными строками. В следующем примере удаляются 20 случайные строки из PurchaseOrderDetail таблицы в базе данных AdventureWorks2022 с датами выполнения, которые ранее 1 июля 2006 г.

DELETE TOP (20) FROM Purchasing.PurchaseOrderDetail WHERE DueDate < '20020701'; GO 

Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY. Следующий запрос удаляет из таблицы PurchaseOrderDetail 10 строк, имеющих самую раннюю дату. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки ( PurchaseOrderID ) должен являться первичным ключом таблицы. Использование неключевого столбца в инструкции подзапроса выборки может привести к удалению более чем 10 строк, если указанный столбец содержит повторяющиеся значения.

DELETE FROM Purchasing.PurchaseOrderDetail WHERE PurchaseOrderDetailID IN (SELECT TOP 10 PurchaseOrderDetailID FROM Purchasing.PurchaseOrderDetail ORDER BY DueDate ASC); GO 

Удаление строк из удаленной таблицы

В примерах в этом разделе описаны способы удаления строк из удаленной таблицы с использованием в качестве ссылки на удаленную таблицу связанного сервера или функции, возвращающей набор строк. Удаленная таблица существует на другом сервере или экземпляре SQL Server.

Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

F. Удаление данных из удаленной таблицы с помощью связанного сервера

В следующем примере будет удалена строка из удаленной таблицы. Этот пример начинается с создания ссылки на удаленный источник данных с помощью хранимой процедуры sp_addlinkedserver. Имя связанного сервера, MyLinkServer , затем определяется как часть четырехчастного имени объекта в форме server.catalog.schema.object.

USE master; GO -- Create a link to the remote data source. -- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'. EXEC sp_addlinkedserver @server = N'MyLinkServer', @srvproduct = N' ', @provider = N'SQLNCLI', @datasrc = N'server_name', @catalog = N'AdventureWorks2022'; GO 
-- Specify the remote data source using a four-part name -- in the form linked_server.catalog.schema.object. DELETE MyLinkServer.AdventureWorks2022.HumanResources.Department WHERE DepartmentID > 16; GO 
G. Удаление данных из удаленной таблицы с помощью функции OPENQUERY

В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции OPENQUERY , возвращающей набор строк. В этом примере используется имя связанного сервера, созданного в предыдущем примере.

DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2022.HumanResources.Department WHERE DepartmentID = 18'); GO 
H. Удаление данных из удаленной таблицы с помощью функции OPENDATASOURCE

В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции OPENDATASOURCE, возвращающей набор строк. Определите допустимое имя сервера для источника данных, используя формат server_name или server_name\instance_name.

DELETE FROM OPENDATASOURCE('SQLNCLI', 'Data Source= ; Integrated Security=SSPI') .AdventureWorks2022.HumanResources.Department WHERE DepartmentID = 17; 

Сбор результатов для инструкции DELETE

I. Использование инструкции DELETE с предложением OUTPUT

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

DELETE Sales.ShoppingCartItem OUTPUT DELETED.* WHERE ShoppingCartID = 20621; --Verify the rows in the table matching the WHERE clause have been deleted. SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621; GO 
J. Использование предложения OUTPUT с аргументом в инструкции DELETE

В следующем примере строки в таблице в ProductProductPhoto базе данных AdventureWorks2022 удаляются на основе условий поиска, определенных в FROM предложении инструкции DELETE . Предложение OUTPUT возвращает столбцы из таблицы, в которой проводится удаление, DELETED.ProductID , DELETED.ProductPhotoID и столбцы из таблицы Product . Оно используется в предложении FROM для указания удаляемых строк.

DECLARE @MyTableVar table ( ProductID int NOT NULL, ProductName nvarchar(50)NOT NULL, ProductModelID int NOT NULL, PhotoID int NOT NULL); DELETE Production.ProductProductPhoto OUTPUT DELETED.ProductID, p.Name, p.ProductModelID, DELETED.ProductPhotoID INTO @MyTableVar FROM Production.ProductProductPhoto AS ph JOIN Production.Product as p ON ph.ProductID = p.ProductID WHERE p.ProductModelID BETWEEN 120 and 130; --Display the results of the table variable. SELECT ProductID, ProductName, ProductModelID, PhotoID FROM @MyTableVar ORDER BY ProductModelID; GO 

Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)

K. Удаление всех строк из таблицы

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

DELETE FROM Table1; 

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

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

DELETE FROM Table1 WHERE StandardCost > 1000.00; 

M. Использование предложения LABEL с инструкцией DELETE

В следующем примере используется метка с инструкцией DELETE.

DELETE FROM Table1 OPTION ( LABEL = N'label1' ); 

О. Использование метки и указания запроса с инструкцией DELETE

Этот запрос показывает базовый синтаксис для использования указания на соединение с запросом с инструкцией INSERT. Дополнительные сведения об указаниях соединения и использовании предложения OPTION см. в статье Предложение OPTION (Transact-SQL).

-- Uses AdventureWorks DELETE FROM dbo.FactInternetSales WHERE ProductKey IN ( SELECT T1.ProductKey FROM dbo.DimProduct T1 JOIN dbo.DimProductSubcategory T2 ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' ) OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ; 

O. Удаление с помощью предложения WHERE

В этом запросе показано, как удалить с помощью предложения WHERE вместо предложения FROM.

DELETE tableA WHERE EXISTS ( SELECT TOP 1 1 FROM tableB tb WHERE tb.col1 = tableA.col1 ) 

P. Удаление по результатам соединения с другой таблицей

В этом примере показано, как удалить из таблицы на основе результата объединения с другой таблицей.

CREATE TABLE dbo.Table1 (ColA int NOT NULL, ColB decimal(10,3) NOT NULL); GO CREATE TABLE dbo.Table2 (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL); GO INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0); INSERT INTO dbo.Table2 VALUES(1, 0.0); GO DELETE dbo.Table2 FROM dbo.Table2 INNER JOIN dbo.Table1 ON (dbo.Table2.ColA = dbo.Table1.ColA) WHERE dboTable2.ColA = 1; 

Команда SQL для удаления и обновление данных в базе (DELETE, UPDATE)

В базу данных можно не только добавлять данные, но и удалять их оттуда. Ещё существует возможность обновить данные в базе. Рассмотрим оба случая.

Удаление данных из базы (DELETE)

Удаление из базы данных происходит с помощью команды "DELETE" (переводится с английского как "УДАЛИТЬ"). Функция удаляет не одну строку, а несколько, при этом выбирает для удаления строки по логике функции "SELECT". То есть чтобы удалить данные из базы, необходимо точно определить их. Приведём пример SQL команды для удаления одной строчки:

DELETE FROM `USERS` WHERE `ID` = 2 LIMIT 1;

Благодаря этому запросу из таблицы "USERS" будет удалена одна запись, у которой в столбце "ID" стоит значение "2".

Обратите внимание, что в конце запроса стоит лимит на выборку "LIMIT 1;" размером в 1 строку. Его можно было не ставить, если поле "ID" является "PRIMARY KEY" (первичный ключ, то есть содержит только уникальные значения). Но всё-таки рекомендуем ставить ограничение "LIMIT 1;" в любом случае, если вы намерены удалить только одну строчку.

Теперь попробуем удалить сразу диапазон данных. Для этого достаточно составить запрос, в результате выполнения которого вернётся несколько строк. Все эти строки будут удалены:

DELETE FROM `USERS` WHERE `ID` >= 5;

Этот запрос удалит все строки в таблицы, у которых в столбце "ID" стоит значение меньше 5. Если не поставить никакого условия "WHERE" и лимита "LIMIT", то будут удалены абсолютно все строки в таблице:

DELETE FROM `USERS`;

На некоторых версиях MySQL способ удаления всех строк через "DELETE FROM _;" может работать медленнее, чем "TRUNCATE _;"; Поэтому для очистки всей таблицы лучше всё-таки использовать "TRUNCATE".

Обновление данных в базе (UPDATE)

Функция обновления "UPDATE" (переводится с английского как "ОБНОВИТЬ") довольно часто используется в проектах сайтов. Как и в случае с функцией "DELETE", фкнция обновления не успокоится до тех пор, пока не обновит все поля, которые подходят под условия, если нет лимита на выборку. Поэтому необходимо задавать однозначные условия, чтобы вместо одной строки нечаянно не обновить половину таблицы. Приведём пример использования команды "UPDATE":

UPDATE `USERS` SET `NAME` = 'Мышь' WHERE `ID` = 3 LIMIT 1;

В этом примере, в таблие "USERS" будет установлено значение "Мышь" в столбец "NAME" у строки, в столбце "ID" которой стоит значение "3". Можно обновить сразу несколько столбцов у одной записи, передав значения через запятую. Попробуем обновить не только значение с толбце "NAME", но и значение в столбце "FOOD" используя один запрос:

UPDATE `USERS` SET `NAME` = 'Мышь', `FOOD` = 'Сыр' WHERE `ID` = 3 LIMIT 1;

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

Как удалить строки из таблицы sql

Тут используется запрос типа DELETE . Если мы хотим удалить вообще все строки из таблицы, то сделать это можно так:

DELETE FROM brands; 

Мы удалили все строки из таблицы brands , таким образом эта таблица теперь пуста.

DELETE FROM cars WHERE price = 1000; 

Добавляя WHERE мы можем выбирать только те строки, которые нам нужны и удалять именно их. Например, выше мы выбрали все автомобили с ценой 1000 из таблицы cars и удалили их все.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *