Delete оператор sql: DELETE | SQL | SQL-tutorial.ru
Содержание
SQL DELETE — удаление данных из таблицы базы данных
Оператор SQL DELETE предназначен для удаления данных из таблицы. Он имеет следующий синтаксис:
DELETE FROM ИМЯ_ТАБЛИЦЫ
WHERE УСЛОВИЕ
Если не указывать условие, из таблицы будут удалены все строки. Кроме того, следует помнить,
что могут быть удалены лишь строки с первичными ключами, на которые не ссылаются внешние ключи в других
таблицах (более подробно об ограничениях удаления — в уроке Реляционная модель данных).
Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД
не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.
А скрипт для создания базы данных «Портал объявлений 1», её таблицы и заполения таблицы данных —
в файле по этой ссылке.
Пример 1. Итак, есть база портала объявлений. В ней есть таблица Ads, содержащая
данные о объявлениях, поданных за неделю (более подробно — в уроке об агрегатных функциях SQL, пример 7).
Таблица выглядит так:
Id | Category | Part | Units | Money |
1 | Транспорт | Автомашины | 110 | 17600 |
2 | Недвижимость | Квартиры | 89 | 18690 |
3 | Недвижимость | Дачи | 57 | 11970 |
4 | Транспорт | Мотоциклы | 131 | 20960 |
5 | Стройматериалы | Доски | 68 | 7140 |
6 | Электротехника | Телевизоры | 127 | 8255 |
7 | Электротехника | Холодильники | 137 | 8905 |
8 | Стройматериалы | Регипс | 112 | 11760 |
9 | Досуг | Книги | 96 | 6240 |
10 | Недвижимость | Дома | 47 | 9870 |
11 | Досуг | Музыка | 117 | 7605 |
12 | Досуг | Игры | 41 | 2665 |
Требуется удалить из таблицы строку, имеющую идентификатор 4. Для этого
пишем следующий запрос (на MS SQL Server — с предваряющей конструкцией USE adportal1;):
DELETE FROM ADS
WHERE Id=4
Пример 2. Можно удалить и несколько строк, если в условии применить
оператор сравнения «больше» или «меньше» (на MS SQL Server — с предваряющей конструкцией USE adportal1;):
DELETE FROM ADS
WHERE Id>4
В результате в таблице останутся лишь следующие строки:
Id | Category | Part | Units | Money |
5 | Стройматериалы | Доски | 68 | 7140 |
6 | Электротехника | Телевизоры | 127 | 8255 |
7 | Электротехника | Холодильники | 137 | 8905 |
8 | Стройматериалы | Регипс | 112 | 11760 |
9 | Досуг | Книги | 96 | 6240 |
10 | Недвижимость | Дома | 47 | 9870 |
11 | Досуг | Музыка | 117 | 7605 |
12 | Досуг | Игры | 41 | 2665 |
Пример 3. Аналогично можно удалять строки с заданными значениями
любого столбца. Удалим, например, строки об объявлениях, за которые выручено менее 10000 денежных единиц
(запрос на MS SQL Server — с предваряющей конструкцией USE adportal1;):
DELETE FROM ADS
WHERE Money
В результате в таблице останутся лишь следующие строки:
Id | Category | Part | Units | Money |
1 | Транспорт | Автомашины | 110 | 17600 |
2 | Недвижимость | Квартиры | 89 | 18690 |
3 | Недвижимость | Дачи | 57 | 11970 |
4 | Транспорт | Мотоциклы | 131 | 20960 |
8 | Стройматериалы | Регипс | 112 | 11760 |
Для удаления всех строк из таблицы применяется оператор SQL DELETE без условий, заданных в секции WHERE и
без любых других ограничей и условий, например, диапазона удаляемых строк. Таким образом, для удаления
всех строк синтаксис оператора DELETE будет следующим (на MS SQL Server — с предваряющей конструкцией USE adportal1;):
DELETE FROM ИМЯ_ТАБЛИЦЫ
Пример 4. Чтобы удалить все данные из таблицы ADS, достаточно
написать следующий запрос:
DELETE FROM ADS
Если после выполнения этого запроса обратиться к таблице ADS при помощи оператора
SELECT, применяемого для получения выборки данных, то будет выведено сообщение о том, что эта
таблица не содержит данных.
Оператору DELETE без условий и ограничений аналогичен оператор TRUNCATE TABLE. Он
также удаляет из таблицы все строки, но выполняется намного быстрее.
Пример 5. Запрос на удаление всех данных из таблицы ADS
при помощи оператора TRUNCATE TABLE будет следующим (на MS SQL Server — с предваряющей конструкцией USE adportal1;):
TRUNCATE TABLE ADS
Примеры запросов к базе данных «Портал объявлений-1» есть также в уроках об
операторах INSERT, UPDATE, HAVING и UNION.
Поделиться с друзьями
Реляционные базы данных и язык SQL
Команда DELETE — Язык запросов SQL
Команда DELETE
Команда DELETE удаляет строки из таблицы или представления основной таблицы базы данных, например, в MySQL, Oracle.
Команда DELETE. Синтаксис команды DELETE
Синтаксис команды DELETE
Команда DELETE. Основные ключевые слова и параметры команды DELETE
- schema — идентификатор полномочий, обычно совпадающий с именем некоторого пользователя
- table view — имя таблицы, из которой удаляются строки; если определяется представление, сервер удаляет строки из основной таблицы представления
- subquery — подзапрос, с помощью которого выбираются строки для удаления; сервер выполняет подзапрос и использует строки его результата как таблицу фразы FROM
- WHERE — удаляет только строки, которые удовлетворяют условию; условие может ссылаться на таблицу и содержать подзапрос.
При выдаче утверждения DELETE включается любой DELETE-триггер, определенный на таблице.
Команда DELETE Пример №1
Удаление всех строк из таблицы:
DELETE FROM temp_assign;
В данном примере команда DELETE удаляет все строки без исключения.
Команда DELETE Пример №2.
Удаляет из таблицы всех продавцов, у которых комиссионные меньше 100 у.е. в месяц:
DELETE FROM emp WHERE JOB = ‘SALESMAN’ AND COMM < 100;
В данном примере команда DELETE удаляет все строки, которые попадают под условие JOB = ‘SALESMAN’ AND COMM < 100;
Команда DELETE Пример №3
Предыдущий пример можно записать по-другому:
DELETE FROM (select * from emp) WHERE job = ‘SALESMAN’ AND comm < 100;
Для удаления всех записей в MySQL можно использовать следующую команду DELETE:
DELETE * FROM table_nam;
Удаление записей, оператор delete
Время от времени возникает задача удаления записей из таблицы. Для этого в SQL предусмотрены операторы DELETE и TRUNCATE, из которых наиболее универсальным и безопасным является первый вариант.
Общая структура запроса с оператором DELETE
DELETE FROM имя_таблицы
[WHERE условие_отбора_записей];
В описанной структуре запроса необязательные параметры указаны в квадратных скобках.
Если условие отбора записей WHERE отсутствует, то будут удалены все записи указанной таблицы.
Эту же операцию (удаления всех записей) можно сделать также с помощью оператора TRUNCATE. Он выполнит удаление таблицы и пересоздаст ее заново — этот вариант работает гораздо быстрее, чем удаление всех записей одна за другой (как в случае с DELETE) особенно для больших таблиц.
Общая структура запроса с оператором TRUNCATE
TRUNCATE TABLE имя_таблицы;
Оптимизатор запросов СУБД MySQL автоматически использует оператор TRUNCATE, если оператор DELETE не содержит условия WHERE или конструкции LIMIT.
Однако у оператора TRUNCATE есть ряд отличий:
- Не срабатывают триггеры, в частности, триггер удаления
- Удаляет все строки в таблице, не записывая при этом удаление отдельных строк данных в журнал транзакций
- Сбрасывает счетчик идентификаторов до начального значения
- Чтобы использовать, необходимы права на изменение таблицы
Удаление записей при многотабличных запросах
Если в DELETE запросе используется JOIN, то необходимо указать из каких(ой) именно таблиц(ы) требуется удалять записи.
DELETE имя_таблицы_1 [, имя_таблицы_2] FROM
имя_таблицы_1 JOIN имя_таблицы_2
ON имя_таблицы_1.поле = имя_таблицы_2.поле
[WHERE условие_отбора_записей];
Например, нам необходимо удалить все бронирования жилья, в котором отсутствует кухня. Тогда запрос будет выглядеть следующим образом:
DELETE Reservations FROM
Reservations JOIN Rooms ON
Reservations.room_id = Rooms.id
WHERE Rooms.has_kitchen = false;
Если бы, помимо удаления бронирования, нам нужно было также удалить и жилье, то запрос приобрел бы следующий вид:
DELETE Reservations, Rooms FROM
Reservations JOIN Rooms ON
Reservations.room_id = Rooms.id
WHERE Rooms.has_kitchen = false;
Сложный Оператор Delete SQL — CodeRoad
Почему операторы delete имеют ограничения, выходящие за рамки их выбранных аналогов?
Я не застрял, потому что проблему было достаточно легко обойти, но я бы предпочел исправить свое понимание, чем продолжать использовать обходные пути.
Например, у меня есть неориентированный список ребер с полями V1 и V2. К сожалению, при создании таблицы я ввел дубликаты (т. е. V1 — > V2 и V2 — > V1). Чтобы идентифицировать дупов, я запустил запрос:
SELECT t1.V1, t1.V2
FROM table t1
WHERE t1.V1 > t1.V2
and EXISTS (
SELECT *
FROM table t2
WHERE t2.V1 = t1.V2
and t2.V2 = t1.V1 )
поскольку это вернуло хороший набор строк из таблицы, я подумал, что смогу заменить строку select на delete и повторить тот же запрос. Sql server однако разозлился и вместо этого дал мне красные буквы. Один раз о синтаксисе и после настройки что-то о связывании составных идентификаторов.
Мне удалось сохранить select в табличной переменной и выполнить delete-это нормально, но что было не так с моим первоначальным подходом и мог ли я сделать это с помощью одного оператора SQL?
sql
tsql
Поделиться
Источник
bob
29 апреля 2013 в 17:47
2 ответа
- Почему один оператор SQL delete вызовет тупик?
Я использую SQL Server 2008 Enterprise. Мне интересно, почему даже один оператор delete этой хранимой процедуры вызовет тупик, если он будет выполняться несколькими потоками одновременно? Для оператора delete Param1 — это столбец таблицы FooTable, Param1-внешний ключ другой таблицы (относится к…
- Cancelled SQL Server delete оператор в середине работы на сервере
Оператор delete был случайно запущен, но отменен в течение нескольких секунд программистом в студии управления sql server. Можно ли узнать, какие записи были удалены, и восстановить их? Это для sql server 2008.
4
SQL Server довольно гибок с delete
. Синтаксис double from
разрешен практически везде, где есть select
:
DELETE FROM t1
FROM table t1
WHERE t1.V1 > t1.V2
and EXISTS (
SELECT *
FROM table t2
WHERE t2.V1 = t1.V2
and t2.V2 = t1. V1 )
Поделиться
Andomar
29 апреля 2013 в 18:01
1
Я думаю, что вам понадобится синтаксис, похожий на этот;
delete from yourTable
where v1 in
(select v1
from etc
)
Поделиться
Dan Bracuk
29 апреля 2013 в 17:55
Похожие вопросы:
Оператор DELETE в sql слишком долго выполняется
У меня есть запрос sql delete, который вызывает удаление 15k записей. ниже приведен формат: query += DELETE FROM table1 WHERE attr1 IN (SELECT distinct attr2 FROM table2 WHERE condition1 = %d AND…
Как запустить множественный оператор Delete sql с помощью java JDBC?
Я хочу удалить сразу три разные таблицы, и у меня есть довольно простой оператор SQL, если на то пошло, как показано ниже : DELETE FROM tbl1;DELETE FROM tbl2;DELETE FROM tbl3; это утверждение верно,. ..
Исправьте этот оператор sql для Insert into, select, delete
INSERT INTO Checkout(ProductID, MemberID, Quantity) SELECT ProductID, MemberID, Quantity FROM Cart WHERE (MemberID = MemberID) DELETE FROM CART WHERE (MemberID = MemberID) Оператор sql…
Почему один оператор SQL delete вызовет тупик?
Я использую SQL Server 2008 Enterprise. Мне интересно, почему даже один оператор delete этой хранимой процедуры вызовет тупик, если он будет выполняться несколькими потоками одновременно? Для…
Cancelled SQL Server delete оператор в середине работы на сервере
Оператор delete был случайно запущен, но отменен в течение нескольких секунд программистом в студии управления sql server. Можно ли узнать, какие записи были удалены, и восстановить их? Это для sql…
Оператор Delete после выполнения SQL insert дважды
Из базы данных Oracle я дважды выполнил оператор insert SQL в производственной среде. К сожалению, вариант отката, похоже, не сработал. В инструкции Insert: INSERT INTO MAE_INT.T_INT_APPLICATION…
SQL Server: DELETE оператор с откатом INSERT оператор в файл
Интересно, как вы можете написать оператор T-SQL DELETE , используя OUTPUT , чтобы выплюнуть операторы INSERT для тех строк, которые вы удалили (в качестве плана отката в будущем), вместо того чтобы…
SQL Server не выполняется оператор Delete
Я создал запрос SQL w / c имеет оператор Delete , но, к сожалению, оператор Delete , похоже, не выполняется. Что не так с моим заявлением SQL? Вот мой код : BEGIN TRAN BEGIN TRY DECLARE @Mid…
Сложный запрос DELETE SQL
Мне нужно сделать запрос SQL, который будет DELETE записью в таблице album , только если подписанный клиент соответствует этим требованиям: // Variables as a demonstration const signedClientId = 1;…
Выполните оператор SQL после каждого DELETE
Есть ли способ заставить jOOQ выполнять оператор SQL (в моем случае a CHECKPOINT ) после каждого DELETE ? В идеале также должен быть способ указать таблицы, для которых это происходит. RDBMS,…
Оператор SQL TRUNCATE: синтаксис, примеры
Оператор SQL TRUNCATE служит для очистки таблицы от всех данных. Оператор SQL TRUNCATE аналогичен оператору SQL DELETE применяемом без оператора SQL WHERE. Основные отличия:
- Оператор SQL TRUNCATE не ведет запись об удаленных данных в журнал событий.
- SQL DELETE осуществляет блокировку построчно, оператор SQL TRUNCATE по всей странице целиком. Вследствие этого, оператор SQL TRUNCATE не возвращает никакого значения, SQL DELETE же, возвращает количество удаленных строк.
- После применения оператора SQL DELETE возможно сделать откат операции и восстановить удаленные данные (команда ROLLBACK). При применении оператора SQL TRUNCATE этого сделать нельзя, однако в СУБД MS SQL Server, оператор может применяться в транзакциях.
Реализация оператора SQL TRUNCATE различна для каждой СУБД, поэтому рекомендуется обращаться к документации используемой системы.
Оператор SQL TRUNCATE имеет следующий синтаксис:
TRUNCATE TABLE Table_name
Примеры оператора SQL TRUNCATE. Имеется следующая таблица Artists:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
Massive Attack | 100th Window | 2003 | 1200000 |
Drowning Pool | Full Circle | 2007 | 800000 |
Massive Attack | Danny The Dog | 2004 | 1900000 |
Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. Удалить все данные из таблицы используя оператор SQL TRUNCATE:
TRUNCATE TABLE Artists
Как было сказано выше, аналогичную задачу можно решить оператором SQL DELETE без использования оператора SQL WHERE:
DELETE FROM Artists
2.18. Удаление данных — Transact-SQL В подлиннике : Персональный сайт Михаила Флёнова
Теперь посмотрим, как можно удалять записи из таблицы. Для этого используется оператор DELETE. Общий вид оператора показан в листинге 2.7.
Листинг 2.7. Общий вид оператора удаления DELETE
DELETE [ FROM ] { table_name WITH ( < table_hint_limited &qt; [ ...n ] ) | view_name | rowset_function_limited } [ FROM { < table_source &qt; } [ ,...n ] ] [ WHERE { < search_condition &qt; | { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } } ]
Минимальная команда удаления выглядит следующим образом:
DELETE tbPeoples
Эта команда удаляет все строки из таблицы tbPeoples. Те же самые действия можно выполнить с помощью вызова команды:
DELETE FROM tbPeoples
Отличие этой команды в том, что мы добавили ключевое слово FROM, которое в данной команде может опускаться.
Пока не надо выполнять эти команды, потому что они очистят таблицу tbPeoples, а нам этого пока не нужно. Данные еще пригодятся для тестирования будущих запросов. Если хотите протестировать удаление, то создайте новую таблицу, заполните ее данными и очистите. Заодно вспомните и закрепите знания, которые мы рассматривали ранее. Можно создать новую таблицу с помощью команды SELECT INTO, это будет проще и быстрее.
Я предпочитаю использовать вторую команду, хотя она выполняет те же самые действия, а содержит на одно слово больше. Просто второй вариант более интеллектуально понятен. В первом случае команда читается как «удалить tbPeoples». Это не совсем корректно. Второй вариант команды звучит как «Удалить из tbPeoples». Это уже ближе отражает суть выполняемых действий.
Честно сказать, такая простота очистки всего содержимого таблицы, на мой взгляд, является недостатком. В моей практике уже не раз были случаи, когда удаление происходило случайно. Просто кто-то выделял в Query Analizyr не полную команду, и таблица очищалась сильнее, чем хотелось бы. Проблема кроется и в том, что в большинстве редакторов нет подтверждения при удаления. Я видел только одну программу, которая перед удалением отображала окно подтверждения и показывала, сколько строк будет удаляться – phpMySQLAdmin. Это программа для управления через WEB интерфейс базой данных MySQL.
Чтобы ограничить количество удаляемых строк, используется секция WHERE. Она используется точно так же, как и в запросах SELECT или UPDATE. Когда мы тестировали оператор INSERT, то вставили в таблицу достаточно много записей. Давайте подчистим их и попрактикуемся в использовании оператора DELETE.
Для начала удалим все строки, в которых поле «vcFamil» содержит нулевое значение. Это делается с помощью следующего запроса:
DELETE FROM tbPeoples WHERE vcFamil is NULL
С помощью секции WHERE мы требуем, чтобы сервер удалил только те записи, в которых поле «vcFamil» содержит нулевое значение.
Следующий запрос удаляет запись, в которой первичный ключ «idPeoples» содержит значение -22:
DELETE FROM tbPeoples WHERE idPeoples = -22
Предыдущие два запроса можно было бы выполнить одной командой:
DELETE FROM tbPeoples WHERE vcFamil is NULL OR idPeoples = -22
В данном случае удаляются записи, в которых или фамилия не заполнена, или ключевое поле равно -22.
Давайте теперь для закрепления материала создадим что-нибудь посложнее. Например, удалим все записи из таблицы tbPeoples, у которых нет записей в таблице телефонов tbPhoneNumbers. Для этого сначала пишем запрос SELECT, чтобы убедиться, что он выбирает необходимые данные и не ошибиться:
SELECT * FROM tbPeoples pl WHERE NOT EXISTS (SELECT idPeoples FROM tbPhoneNumbers pn WHERE pl.idPeoples=pn.idPeoples)
Этот запрос выбирает все строки, для которых не существует (NOT EXISTS) записи в таблице tbPhoneNumbers. Отличный пример, ведь подобные запросы приходиться писать достаточно часто.
Теперь модифицируем пример для того, чтобы он удалял выбранные данные. Для этого первую строку заменяем на DELETE:
DELETE FROM tbPeoples WHERE NOT EXISTS (SELECT idPeoples pl FROM tbPhoneNumbers pn WHERE pl.idPeoples=pn.idPeoples)
Но этого не достаточно, потому что при удалении, в секции FROM не должно быть псевдонимов. Это значит, что от них нужно отказаться и в подзапросе использовать вместо псевдонима полное имя таблицы из внешнего запроса:
DELETE FROM tbPeoples WHERE NOT EXISTS (SELECT idPeoples FROM tbPhoneNumbers pn WHERE tbPeoples.idPeoples=pn.idPeoples)
Недавно меня один очень опытный программист спросил: «А можно использовать оператор LIKE при удалении?». А почему бы и нет? Можно использовать любые операторы, которые мы изучали для секции WHERE, и LIKE тут не исключение. Следующий запрос удалит все записи, в которых фамилия начинается с буквы «С»:
DELETE FROM tbPeoples WHERE vcFamil LIKE 'С'
Теперь рассмотрим удаление из связанных таблиц. Допустим, что нам необходимо удалить номера телефонов определенного работника. Для этого выполняем следующий запрос:
DELETE pn FROM tbPhoneNumbers pn, inserted i WHERE pn.idPeoples=i.idPeoples AND vcFamil = Фамилия
Нельзя удалять сразу из двух таблиц, может быть только одна. Так как в этом примере связываются две таблицы, то после оператора DELETE необходимо явно указать, из какой из двух происходит удаление.
При удалении данных, для каждой удаляемой строки в журнале транзакций создается отдельная запись. О транзакциях мы подробно поговорим в разделе 2.19, а сейчас нам необходимо понимать, что это достаточно трудоемкий процесс. Это можно понять, даже не вникая в суть самих транзакций. Журнал транзакций – это файл и в него происходит запись для каждой удаляемой строки. Если в таблице 1 000 000 записей, то будет столько же обращений к жесткому диску, а если каждое обращение к диску отнимет хотя бы 10 байт данных, то мы потеряем на жестком диске 10 000 000 байт свободного пространства. Я думаю, что нас ожидают не очень радужные перспективы.
Но у MS SQL Server есть вариант решения этой проблемы — TRUNCATE TABLE. Ее можно использовать при удалении из таблицы всех записей, и при этом обращения к журналу будут сведены к минимуму. Для удаления всех записей из таблицы Товары нужно использовать следующий запрос:
TRUNCATE TABLE Имя_Таблицы
В результате этого из таблицы будут удалены все записи, а в журнал будет записано только информация о том, что все удалено.
С помощью оператора TRUNCATE TABLE можно удалять только все записи из таблицы, потому что нет секции WHERE. К тому же, нельзя удалять из таблицы, которая связана с помощью внешнего ключа.
Есть еще одно очень важное отличие между операторами DELETE и TRUNCATE TABLE. Если удалить все записи из таблицы с помощью DELETE, а затем добавить новую запись, то значение автоматически увеличиваемого поля будет увеличиваться дальше, т.е. счетчик не будет сброшен. А после удаления с помощью TRUNCATE TABLE, значение счетчика сбрасывается и если после этого добавить строку, то значение автоматически увеличиваемого поля начнет свой отсчет с единицы. Учитывайте этот эффект при использовании определенного оператора удаления данных.
Удаление записей из базы данных SQL
Удаление записей
Для удаления записей из таблицы применяется оператор DELETE:
DELETE FROM имяТаблицы WHERE условие;
Данный оператор удаляет из указанной таблицы записи (а не отдельные значения столбцов), которые удовлетворяют указанному условию. Условие — это логическое выражение, различные конструкции которого были рассмотрены в предыдущих лабораторных занятиях.
Следующий запрос удаляет записи из таблицы Customer, в которой значение столбца LName равно ‘Иванов’:
DELETE FROM Customer
WHERE LName = ‘Иванов’
Если таблица содержатся сведения о нескольких клиентах с фамилией Иванов, то все они будут удалены.
В операторе WHERE может находиться подзапрос на выборку данных (оператор SELECT). Подзапросы в операторе DELETE работают точно так же, как и в операторе SELECT. Следующий запрос удаляет всех клиентов из города Москва, при этом уникальный идентификатор города возвращается с помощью подзапроса.
DELETE FROM Customer
WHERE IdCity IN (SELECT IdCity FROM City WHERE CityName = ‘Москва’)
Transact-SQL расширяет стандартный SQL, позволяя использовать в инструкции DELETE еще одно предложение FROM. Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк. Оно позволяет задавать данные из второго FROM и удалять соответствующие строки из таблицы в первом предложении FROM. В частности предыдущий запрос может быть переписан следующим образом
DELETE FROM Customer
FROM Customer k INNER JOIN
City c ON k.IdCity = c.IdCity AND c.CityName = ‘Москва’
Операция удаления записей из таблицы является опасной в том смысле, что связана с риском необратимых потерь данных в случае семантических (но не синтаксических) ошибок при формулировке SQL-выражения. Чтобы избежать неприятностей, перед удалением записей рекомендуется сначала выполнить соответствующий запрос на выборку, чтобы просмотреть, какие записи будут удалены. Так, например, перед выполнением рассмотренного ранее запроса на удаление не помешает выполнить соответствующий запрос на выборку.
SELECT *
FROM Customer k INNER JOIN
City c ON k.IdCity = c.IdCity AND c.CityName = ‘Москва’
Для удаления всех записей из таблицы достаточно использовать оператор DELETE без ключевого слова WHERE. При этом сама таблица со всеми определенными в ней столбцами сохраняется и готова для вставки новых записей. Например, следующий запрос удаляет записи обо всех товарах.
DELETE FROM Product
Задание для самостоятельной работы: Сформулируйте на языке SQL запрос на удаление всех заказов, не имеющих в составе ни одного товара (т. е. все пустые заказы).
Еще записи по теме
Оператор SQL DELETE
Оператор SQL DELETE
Оператор DELETE
используется для удаления существующих записей в таблице.
УДАЛИТЬ Синтаксис
УДАЛИТЬ ИЗ имя_таблицы ГДЕ условие ;
Примечание: Будьте осторожны при удалении записей в таблице! Обратите внимание на
в
Предложение WHERE
DELETE
выписка.
Предложение WHERE
определяет, какие записи следует удалить.Если
если опустить предложение WHERE
, все записи в таблице будут удалены!
Демо-база данных
Ниже представлен выбор из таблицы «Клиенты» в примере Northwind.
база данных:
Идентификатор клиента | Имя клиента | ContactName | Адрес | Город | Почтовый индекс | Страна |
---|---|---|---|---|---|---|
1 | Альфредс Футтеркисте | Мария Андерс | Obere Str.57 | Берлин | 12209 | Германия |
2 | Ana Trujillo Emparedados y helados | Ана Трухильо | Avda. de la Constitución 2222 | México D.F. | 05021 | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Матадерос 2312 | Мексика Д.F. | 05023 | Мексика |
4 | Вокруг Рога | Томас Харди | 120 Ганновер пл. | Лондон | WA1 1DP | Великобритания |
5 | Berglunds snabbköp | Кристина Берглунд | Berguvsvägen 8 | Лулео | С-958 22 | Швеция |
Пример SQL DELETE
Следующий оператор SQL удаляет клиента «Alfreds Futterkiste» из
Таблица «Покупатели»:
Пример
УДАЛИТЬ ОТ клиентов
ГДЕ CustomerName = ‘Альфред Футтеркисте’;
Попробуй сам »
Таблица «Клиенты» теперь будет выглядеть так:
Идентификатор клиента | Имя клиента | ContactName | Адрес | Город | Почтовый индекс | Страна |
---|---|---|---|---|---|---|
2 | Ana Trujillo Emparedados y helados | Ана Трухильо | Avda.de la Constitución 2222 | México D.F. | 05021 | Мексика |
3 | Антонио Морено Такерия | Антонио Морено | Матадерос 2312 | México D.F. | 05023 | Мексика |
4 | Вокруг Рога | Томас Харди | 120 Ганновер пл. | Лондон | WA1 1DP | Великобритания |
5 | Berglunds snabbköp | Кристина Берглунд | Berguvsvägen 8 | Лулео | С-958 22 | Швеция |
Удалить все записи
Можно удалить все строки в таблице, не удаляя таблицу. Этот
означает, что структура таблицы, атрибуты и индексы останутся без изменений:
Следующий оператор SQL удаляет все строки в таблице «Клиенты»,
без удаления таблицы:
SQL DELETE — удаление данных в таблице или нескольких таблицах
Сводка : в этом руководстве вы узнаете, как использовать оператор SQL DELETE для удаления одной или нескольких строк в таблице.
Оператор DELETE
навсегда удаляет одну или несколько строк из таблицы. Синтаксис оператора DELETE
следующий:
DELETE FROM table WHERE condition; |
Чтобы удалить одну или несколько строк в таблице:
- Сначала вы указываете имя таблицы, из которой вы хотите удалить данные, в предложении
DELETE FROM
. - Во-вторых, вы помещаете условие в предложение WHERE, чтобы указать, какие строки следует удалить.Если вы опустите предложение
WHERE
, оператор удалит все строки в таблице.
Если вы хотите удалить все строки в большой таблице, вы должны использовать оператор TRUNCATE TABLE, который более эффективен, чем оператор DELETE
.
Примеры SQL DELETE
Давайте рассмотрим несколько примеров использования оператора DELETE.
SQL DELETE — удаление одной строки в таблице
Следующий оператор удаляет сотрудника с идентификатором 3 из таблицы сотрудников
:
УДАЛИТЬ ОТ сотрудников WHERE employeeID = 3; |
SQL DELETE — удаление всех строк в таблице
Чтобы удалить все строки в таблице employee
, вы просто выполните следующий запрос: (не рекомендуется и сделайте резервную копию перед этим)
SQL DELETE — удаление связанных строк в нескольких таблицах
Это становится более сложным, когда вы хотите удалить строку в таблице, которая связана с другими строками в другой таблице.
Например, каждый сотрудник работает на одной или нескольких территориях, и на каждой территории есть несколько сотрудников. Таблица территорий сотрудников
используется для хранения отношений между сотрудниками и территориями.
При удалении строки в таблице employee
необходимо также удалить связанные строки в таблице employeeterritories
. Для этого необходимо выполнить два оператора DELETE
следующим образом:
DELETE FROM employee WHERE employeeID = 3; |
УДАЛИТЬ С территории сотрудников WHERE employeeID = 3 |
Большинство систем управления базами данных позволяют создать ограничение внешнего ключа, чтобы при удалении строки в таблице соответствующие строки соответствующая таблица также удаляется автоматически.Это гарантирует целостность данных. В этом случае вам просто нужно выполнить первый оператор DELETE
только для удаления строк в двух таблицах.
В случае, если система управления базой данных не поддерживает ограничение внешнего ключа, необходимо выполнить оба оператора DELETE
в одной транзакции, чтобы убедиться, что операторы выполняются в режиме «все или ничего».
В этом руководстве мы показали вам, как использовать оператор SQL DELETE
для удаления одной или нескольких строк в таблице.
- Было ли это руководство полезным?
- Да Нет
SQL | Оператор DELETE — GeeksforGeeks
SQL | Оператор DELETE
Оператор DELETE в SQL используется для удаления существующих записей из таблицы. Мы можем удалить одну запись или несколько записей в зависимости от условия, которое мы указываем в предложении WHERE.
Базовый синтаксис:
УДАЛИТЬ ИЗ имя_таблицы WHERE some_condition; table_name : имя таблицы some_condition : условие выбора конкретной записи.
Примечание: Мы можем удалить как отдельные, так и несколько записей в зависимости от условия, указанного в предложении WHERE. Если мы опустим предложение WHERE, все записи будут удалены, а таблица будет пустой.
Пример таблицы:
Примеры запросов:
- Удаление отдельной записи : удалите строки, в которых ИМЯ = «Ram». Это удалит только первую строку.
УДАЛИТЬ ОТ ученика, ГДЕ ИМЯ = «Баран»;
Вывод:
Приведенный выше запрос удалит только первую строку, и таблица Студент теперь будет выглядеть так:ROLL_NO ИМЯ АДРЕС ТЕЛЕФОН Возраст 2 RAMESH GURGAON XXXXXXXXXX 18 3 SUJIT ROHTAK XXXXXXXXXX ES
Дели XXXXXXXXXX 18 3 SUJIT ROHTAK XXXXXXXXXX 20 2 RAMESH GURGAON XXXXXXX52 9013 GURGAON XXXXXXX52 несколько записей : удалить строки из таблицы e Учащийся 20 лет.Это удалит 2 строки (третья строка и пятая строка). УДАЛИТЬ ОТ ученика ГДЕ Возраст = 20;
Вывод:
Приведенный выше запрос удалит две строки (третья строка и пятая строка), и таблица Student теперь будет выглядеть так:ROLL_NO NAME ADDRESS ТЕЛЕФОН Возраст 1 Оперативная память Дели XXXXXXXXX 18 2 RAMESH GURGAON XXXXXXX35 XXXXXXX35 4 SURESH Delhi XXXXXXXXXX 18 2 RAMESH GURGAON XXXXXXXXXX 18 - Удалить все записи это, как показано ниже,
query1: «УДАЛИТЬ ОТ ученика»; query2: «УДАЛИТЬ * ОТ ученика»;
Вывод:
Все записи в таблице будут удалены, не останется записей для отображения.Стол Студент станет пустым!Тест по SQL
Эта статья предоставлена Harsh Agarwal . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарий, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью курса DSA Self Paced Course по приемлемой для студентов цене и будьте готовы к работе в отрасли.
SQL Server DELETE — удаление одной или нескольких строк из таблицы
Сводка : в этом руководстве вы узнаете, как использовать оператор SQL Server
DELETE
для удаления одной или нескольких строк из таблицы.Введение в SQL Server
Оператор DELETE
Чтобы полностью удалить одну или несколько строк из таблицы, используйте оператор
DELETE
.Следующее иллюстрирует его синтаксис:DELETE [TOP (выражение) [PERCENT]] FROM table_name [WHERE search_condition];
Сначала вы указываете имя таблицы, из которой должны быть удалены строки, в предложении
FROM
.Например, следующий оператор удалит все строки из
target_table
:DELETE FROM target_table;
Во-вторых, чтобы указать количество или процент случайных строк, которые будут удалены, вы используете предложение
TOP
.Например, следующий оператор
DELETE
удаляет 10 случайных строк изtarget_table
:DELETE TOP 10 FROM target_table;
Поскольку таблица хранит свои строки в неопределенном порядке, мы не знаем, какие строки будут удалены, но мы точно знаем, что количество строк будет удалено равно 10.
Точно так же вы можете удалить 10 процентов случайных строк, используя следующий оператор
DELETE
:DELETE TOP 10 PERCENT FROM target_table;
В-третьих, практически говоря, вы редко удаляете все строки из таблицы, а только одну или несколько строк.В этом случае вам необходимо указать
search_condition
в предложенииWHERE
, чтобы ограничить количество удаляемых строк.Строки, из-за которых
search_condition
оценивается как истинное, будут удалены.Предложение
WHERE
является необязательным. Если вы его пропустите, операторDELETE
удалит все строки из таблицы.SQL Server
DELETE
Примеры операторовДавайте создадим новую таблицу для демонстрации.
Следующий оператор создает таблицу с именем
production.product_history
с данными, скопированными из таблицыproduction.products
:SELECT * INTO production.product_history ИЗ production.products;
Следующий запрос возвращает все строки из таблицы
product_history
:SELECT * FROM production.product_history;
Как ясно видно из выходных данных, всего у нас 321 строка.
1) Удалить количество случайных строк, пример
Следующий оператор
DELETE
удаляет 21 случайную строку из таблицыproduct_history
:DELETE TOP (21) ИЗ production.product_history;
Вот сообщение, выданное SQL Server:
(затронута 21 строка)
Это означает, что 21 строка была удалена.
2) Удалить процент случайных строк, пример
Следующий оператор
DELETE
удаляет 5 процентов случайных строк из таблицыproduct_history
:DELETE TOP (5) PERCENT ИЗ production.product_history;
SQL Server выдал следующее сообщение, указывающее, что 15 строк (300 x 5% = 15) были удалены.
(затронуто 15 рядов)
3) Удалить несколько строк с примером условия
Следующий оператор
DELETE
удаляет все продукты с модельным годом 2017:DELETE ИЗ производство.product_history ГДЕ model_year = 2017;
Вот выходное сообщение:
(затронуто 75 строк)
4) Удалить все строки из примера таблицы
Следующий оператор
DELETE
удаляет все строки из таблицыproduct_history
:DELETE ОТ ПРОИЗВОДСТВА.product_history;
Обратите внимание, что если вы хотите удалить все строки из большой таблицы, вы должны использовать оператор
TRUNCATE TABLE
, который работает быстрее и эффективнее.В этом руководстве вы узнали, как использовать оператор SQL Server
DELETE
для удаления одной или нескольких строк из таблицы.Оператор SQL DELETE — с примерами
Как удалить записи в SQL?
DELETE безвозвратно удаляет записи из таблицы.
DELETE может удалить одну или несколько записей в таблице.
Используйте предложение WHERE, чтобы УДАЛИТЬ только определенные записи.Синтаксис SQL DELETE
Общий синтаксис:
УДАЛИТЬ имя-таблицы
Чтобы удалить определенные записи, добавьте предложение WHERE:
УДАЛИТЬ имя-таблицы ГДЕ условие
ПРОДУКТ Идентификатор Наименование продукта Идентификатор поставщика Цена единицы Упаковка Снято с производства Примеры SQL DELETE
Проблема : Удалить все продукты.
УДАЛИТЬ продукт
Результат: 77 записей удалены.
ПРОДУКТ Идентификатор Наименование продукта Идентификатор поставщика Цена единицы Упаковка Снято с производства Проблема : Удалить продукты стоимостью более 50 долларов.
УДАЛИТЬ продукт ГДЕ UnitPrice> 50
Результат: 7 записей удалены.
КЛИЕНТ Идентификатор Имя Фамилия Город Страна Телефон Проблема : Удалить клиента с Id = 21.
УДАЛИТЬ клиента ГДЕ Id = 21
Это распространенный сценарий, при котором удаляется одна запись.
Результат: 1 запись удалена.
Оператор SQL DELETE
Автор: Чайтанья Сингх | Файл: SQL
Оператор SQL DELETE используется для безвозвратного удаления существующих записей (строк) из таблицы. Этот оператор можно использовать для удаления одной или нескольких записей из таблицы.Мы можем использовать предложение where с оператором DELETE для удаления определенных записей из таблицы, однако при отсутствии предложения where оператор DELETE навсегда удаляет все записи из таблицы.
Синтаксис оператора DELETE
Чтобы удалить определенные строки из таблицы:
УДАЛИТЬ FROM table_name ГДЕ Условие;
Чтобы удалить все строки из таблицы:
УДАЛИТЬ FROM table_name;
Этот оператор удаляет все записи из таблицы, но сама таблица не удаляется, поэтому структура таблицы, атрибуты и индексы остаются нетронутыми.
Пример инструкции SQL DELETE
Таблица: Клиенты
CustomerName Сумма PurchaseYear OrderNo ------------ ------ ------------ ------- Пол 1500 2018 1001 Рик 1600 2019 1100 Дерек 800 2017 1301 Шеру 1100 2016 1789
Допустим, мы хотим удалить записи из таблицы, где год покупки предшествует 2018 году.
Следующий оператор SQL удаляет определенные записи из таблицы, где PurchaseYear меньше 2018 года.УДАЛИТЬ ОТ клиентов, ГДЕ Покупка Год <2018;
Результатов:
Таблица Customers после выполнения вышеуказанного оператора DELETE будет выглядеть следующим образом:CustomerName Сумма PurchaseYear OrderNo ------------ ------ ------------ ------- Пол 1500 2018 1001 Рик 1600 2019 1100
Давайте возьмем еще несколько примеров :
Пример: Удалите запись о клиенте, где CustomerName - «Рик»:
УДАЛИТЬ ОТ клиентов, ГДЕ CustomerName = 'Rick';
Этот оператор удалит 1 запись из таблицы.
Пример: Удалить записи, в которых сумма больше 1000:
УДАЛИТЬ ОТ клиентов, ГДЕ Сумма> 1000;
Этот оператор удалит 3 записи из таблицы.
Удалить все записи из таблицы
Чтобы удалить все записи из таблицы, мы используем оператор DELETE без предложения where. Например: Допустим, мы хотим удалить все записи из таблицы «Клиенты».
УДАЛИТЬ ОТ клиентов;
Этот оператор удаляет все строки из таблицы, но сама таблица не удаляется, поэтому структура таблицы, атрибуты таблицы и индексы остаются нетронутыми.
MySQL :: Справочное руководство MySQL 8.0 :: 13.2.2 Оператор DELETE
DELETE
- это оператор DML,
удаляет строки из таблицы.Оператор
DELETE
может начинаться с
С предложением
для определения общей таблицы
выражения, доступные в
УДАЛИТЬ
. См. Раздел 13.2.15, «WITH (общие табличные выражения)».Однотабличный синтаксис
УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE] FROM имя_таблицы [[AS] псевдоним_таблицы ] [РАЗДЕЛ ( имя_раздела [, имя_раздела ])...)] [WHERE where_condition ] [СОРТИРОВАТЬ ПО ...] [LIMIT row_count ]
Оператор
DELETE
удаляет строки из
tbl_name
и возвращает количество
удаленные строки. Чтобы проверить количество удаленных строк, вызовите
ROW_COUNT ()
функция, описанная в
Раздел 12.16, «Информационные функции».Основные статьи
Условия в дополнительном пункте
WHERE
определить, какие строки нужно удалить.БезГДЕ
предложение, все строки удаляются.где_условие
- выражение, которое
оценивается как истина для каждой удаляемой строки. Он указан как
описано в Раздел 13.2.10, «Оператор SELECT».Если указано предложение
ORDER BY
, строки
удаляются в указанном порядке. В
LIMIT Пункт
устанавливает ограничение на количество
строки, которые можно удалить.Эти пункты применяются к одиночным таблицам
удаляет, но не удаляет несколько таблиц.Синтаксис для нескольких таблиц
УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE] имя_таблицы [. *] [, имя_таблицы [. *]] ... ИЗ table_references [WHERE where_condition ] УДАЛИТЬ [LOW_PRIORITY] [QUICK] [IGNORE] FROM имя_таблицы [. *] [, имя_таблицы [. *]] ... ИСПОЛЬЗОВАНИЕ table_references [ГДЕ , где_условие ]
Привилегии
Вам нужна привилегия
DELETE
на
table, чтобы удалить из него строки.Вам нужно только
SELECT
привилегия для любых столбцов
которые только читаются, например, те, которые указаны в
WHERE
clause.Производительность
Когда вам не нужно знать количество удаленных строк,
TRUNCATE TABLE
оператор является
более быстрый способ очистить стол, чем
DELETE
выписка без
WHERE
clause. в отличие
УДАЛИТЬ
,
TRUNCATE TABLE
не может быть использован
внутри транзакции или если у вас есть блокировка таблицы.Видеть
Раздел 13.1.37, «Оператор TRUNCATE TABLE» и
Раздел 13.3.6, «Операторы LOCK TABLES и UNLOCK TABLES».На скорость операций удаления также могут влиять факторы.
обсуждается в Раздел 8.2.5.3, «Оптимизация операторов DELETE».Чтобы гарантировать, что данный
УДАЛИТЬ
не занимает много времени, специфичный для MySQL
LIMIT
row_count
пункт дляDELETE
определяет
максимальное количество удаляемых строк.Если количество строк до
удаление превышает лимит, повторите
DELETE
до количества затронутых
строк меньше значенияLIMIT
.Подзапросы
Вы не можете удалить из таблицы и выбрать из той же таблицы в
подзапрос.Опора для разделенных таблиц
DELETE
поддерживает явный выбор раздела
используя предложениеPARTITION
, которое принимает список
разделенных запятыми имен одного или нескольких разделов или
подразделы (или оба), из которых можно выбрать строки для удаления.Разделы, не включенные в список, игнорируются. Учитывая
многораздельная таблицаt
с разделом с именем
p0
, выполнение оператораDELETE
оказывает такое же влияние на таблицу
FROM t PARTITION (p0)
как выполнениеALTER
; в обоих случаях все строки
ТАБЛИЦА t ОБРЕЗАТЬ РАЗДЕЛ (p0)
в разделесбрасываются p0
.РАЗДЕЛ
можно использовать вместе с
ГДЕ
условие, в этом случае условие
проверено только на строках в перечисленных разделах.Например,
УДАЛИТЬ ИЗ РАЗДЕЛА t (p0), ГДЕ c <5
удаляет строки только из разделаp0
, для которого
выполняется условиеc <5
; строк в любых
другие разделы не проверяются и, следовательно, на них не распространяется
УДАЛИТЬ
.Предложение
PARTITION
также может использоваться в
несколько таблицDELETE
операторов. Ты можешь использовать
до одной такой опции для каждой таблицы, названной в
ИЗ
вариант.Для получения дополнительной информации и примеров см.
Раздел 24.5, «Выбор раздела».Столбцы с автоматическим приращением
Если вы удалите строку, содержащую максимальное значение для
AUTO_INCREMENT
столбец, значение не используется повторно
дляMyISAM
илиInnoDB
Таблица. Если вы удалите все строки в таблице с помощьюDELETE
(без
ИЗимя_таблицы
WHERE
clause) в
autocommit
mode, последовательность
запускается заново для всех механизмов хранения, кроме
InnoDB
иMyISAM
.Есть
некоторые исключения из этого поведения дляInnoDB
таблицы, как описано в
Раздел 15.6.1.6, «Обработка AUTO_INCREMENT в InnoDB».Для таблиц
MyISAM
можно указать
AUTO_INCREMENT
вторичный столбец в
ключ из нескольких столбцов. В этом случае повторное использование значений, удаленных из
начало последовательности встречается даже дляMyISAM
столы. См. Раздел 3.6.9, «Использование AUTO_INCREMENT».Модификаторы
Оператор
DELETE
поддерживает
следующие модификаторы:Если вы укажете модификатор
LOW_PRIORITY
,
сервер задерживает выполнение
УДАЛИТЬ
, пока не прекратятся другие клиенты
читаем из таблицы.Это влияет только на механизмы хранения.
которые используют только блокировку на уровне таблицы (например,
MyISAM
,ПАМЯТЬ
и
MERGE
).Для таблиц
MyISAM
, если вы используете
QUICK
модификатор, механизм хранения не работает.
индекс слияния уходит во время удаления, что может ускорить некоторые
виды операций удаления.Модификатор
IGNORE
заставляет MySQL игнорировать
игнорируемые ошибки в процессе удаления строк.(Ошибки
обнаруженные на этапе синтаксического анализа, обрабатываются в
обычным способом.) Ошибки, которые игнорируются из-за использования
IGNORE
возвращаются как предупреждения. Для большего
Для получения дополнительной информации см. «Влияние IGNORE на выполнение оператора».
Порядок удаления
Если оператор
DELETE
включает
ORDER BY
, строки удаляются в порядке
указанные в пункте. Это полезно в первую очередь в сочетании
сLIMIT
.Например, следующие
оператор находит строки, соответствующие предложениюWHERE
,
сортирует их поtimestamp_column
и удаляет
первый (самый старый):УДАЛИТЬ ИЗ somelog WHERE user = 'jcole' ORDER BY timestamp_column LIMIT 1;
ORDER BY
также помогает удалять строки в заказе
требуется, чтобы избежать нарушений ссылочной целостности.Таблицы InnoDB
Если вы удаляете много строк из большой таблицы, вы можете превысить
размер таблицы блокировок для таблицыInnoDB
.К
избежать этой проблемы или просто свести к минимуму время, в течение которого стол
остается заблокированным, следующая стратегия (которая не использует
DELETE
вообще) может быть полезно:Выберите строки , а не , которые нужно удалить в
пустая таблица, имеющая ту же структуру, что и исходная таблица:INSERT INTO t_copy SELECT * FROM t WHERE ...;
Используйте
RENAME TABLE
, чтобы атомарно
переместите исходную таблицу в сторону и переименуйте копию в
исходное название:ПЕРЕИМЕНОВАТЬ ТАБЛИЦУ t TO t_old, t_copy TO t;
Отбросьте исходную таблицу:
ТАБЛИЦА ПАДЕНИЯ t_old;
Никакие другие сеансы не могут получить доступ к задействованным таблицам, пока
RENAME TABLE
выполняется, поэтому
Операция переименования не вызывает проблем с параллелизмом.Видеть
Раздел 13.1.36, «Оператор RENAME TABLE».Таблицы MyISAM
В таблицах
MyISAM
удаленные строки сохраняются.
в связанном списке и последующих
INSERT
операций повторно используют старую строку
позиции. Чтобы освободить неиспользуемое пространство и уменьшить размер файлов, используйте
OPTIMIZE TABLE
заявление или
myisamchk Утилита для реорганизации таблиц.
ТАБЛИЦА ОПТИМИЗАЦИИ
проще в использовании,
но myisamchk шустрее.Видеть
Раздел 13.7.3.4, «Оператор OPTIMIZE TABLE» и Раздел 4.6.4, «myisamchk - Утилита обслуживания таблиц MyISAM».Модификатор
QUICK
влияет на то, покидает ли индекс
объединяются для операций удаления.УДАЛИТЬ БЫСТРО
наиболее полезен для приложений, в которых значения индекса для удаленных
строки заменяются аналогичными значениями индекса из вставленных строк
позже. В этом случае повторно используются дыры, оставленные удаленными значениями.БЫСТРОЕ УДАЛЕНИЕ
не используется при удалении значений
приводит к неполному заполнению индексных блоков, охватывающих диапазон значений индекса
для которых снова появляются новые вставки.В этом случае использование
QUICK
может привести к потере места в индексе
что остается невостребованным. Вот пример такого сценария:Создайте таблицу, содержащую индексированный
AUTO_INCREMENT
столбец.Вставьте много строк в таблицу. Каждая вставка приводит к
значение индекса, которое добавляется к верхнему пределу индекса.Удалить блок строк в нижнем конце диапазона столбцов
используяDELETE QUICK
.
В этом сценарии индексные блоки, связанные с удаленным
значения индекса не заполняются, но не объединяются с другими
index блоков за счет использованияQUICK
. Они
остаются незаполненными при новых вставках, потому что новые строки не
имеют значения индекса в удаленном диапазоне. Кроме того, они остаются
недостаточно заполнен, даже если вы позже воспользуетесь
DELETE
без
QUICK
, если только некоторые из удаленных значений индекса
оказываются в индексных блоках внутри или рядом с
недозаполненные блоки.Чтобы освободить неиспользуемое пространство индекса под этими
обстоятельства, используйтеOPTIMIZE TABLE
.Если вы собираетесь удалить много строк из таблицы, это может быть
быстрее использоватьУДАЛИТЬ БЫСТРО
с последующим
ТАБЛИЦА ОПТИМИЗАЦИИ
. Это восстанавливает
index вместо выполнения многих операций слияния блоков индекса.Удаление нескольких таблиц
Вы можете указать несколько таблиц в
DELETE
инструкция для удаления строк
из одной или нескольких таблиц в зависимости от условия в
WHERE
clause.Вы не можете использоватьORDER
или
BYLIMIT
в многостоловой
УДАЛИТЬ
. В
table_references
пункт перечисляет
таблицы, участвующие в объединении, как описано в
Раздел 13.2.10.2, «Пункт JOIN».Для первого синтаксиса с несколькими таблицами только соответствующие строки из
таблицы, перечисленные перед пунктомFROM
, являются
удалено. Для второго синтаксиса с несколькими таблицами только совпадающие строки
из таблиц, перечисленных в пунктеИЗ
(перед предложениемUSING
) удаляются.В
эффект заключается в том, что вы можете удалять строки из многих таблиц одновременно
time и есть дополнительные таблицы, которые используются только для поиска:УДАЛИТЬ t1, t2 ИЗ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t3 ГДЕ t1.id = t2.id И t2.id = t3.id;
Или же:
УДАЛИТЬ ИЗ t1, t2 ИСПОЛЬЗУЯ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t3 ГДЕ t1.id = t2.id И t2.id = t3.id;
Эти операторы используют все три таблицы при поиске строк для
удалить, но удалить совпадающие строки только из таблиц
t1
иt2
.В предыдущих примерах используется
INNER JOIN
, но
несколько таблицDELETE
операторов
может использовать другие типы соединений, разрешенные в
SELECT
операторов, например
ЛЕВОЕ СОЕДИНЕНИЕ
. Например, чтобы удалить строки,
существуют вt1
, которые не совпадают в
t2
, используйтеLEFT JOIN
:УДАЛИТЬ t1 ИЗ t1 ЛЕВОЕ СОЕДИНЕНИЕ t2 НА t1.id = t2.id ГДЕ t2.id ЕСТЬ NULL;
Синтаксис разрешает
.*
после каждого
имя_таблицы
для совместимости с
Доступ .Если вы используете многотабличный
DELETE
оператор, включающийтаблиц InnoDB
, для которых
есть ограничения внешнего ключа, оптимизатор MySQL может
обрабатывают таблицы в порядке, отличном от их
родительско-дочерние отношения. В этом случае утверждение не выполняется и
откатывается. Вместо этого вы должны удалить из одной таблицы и
полагаться на возможностиON DELETE
, которые
InnoDB
позволяет заставить другие таблицы быть
изменен соответствующим образом.Примечание
Если вы объявляете псевдоним для таблицы, вы должны использовать псевдоним, когда
ссылаясь на таблицу:УДАЛИТЬ t1 ИЗ теста AS t1, test2 ГДЕ ...
Псевдонимы таблиц в нескольких таблицах
DELETE
следует декларировать только в
table_references
часть
утверждение. В других местах ссылки на псевдонимы разрешены, но не на псевдонимы.
декларации.Верный:
УДАЛИТЬ a1, a2 ИЗ t1 КАК a1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 КАК a2 ГДЕ a1.id = a2.id; УДАЛИТЬ ИЗ a1, a2 ИСПОЛЬЗУЯ t1 КАК a1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 КАК a2 ГДЕ a1.id = a2.id;
Неправильно:
УДАЛИТЬ t1 КАК a1, t2 КАК a2 ИЗ t1 ВНУТРЕННЕГО СОЕДИНЕНИЯ t2 ГДЕ a1.id = a2.id; УДАЛИТЬ ИЗ t1 КАК a1, t2 КАК a2 ИСПОЛЬЗУЯ t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ t2 ГДЕ a1.id = a2.id;
Псевдонимы таблиц также поддерживаются для одиночных таблиц.
- Удалить все записи это, как показано ниже,