SQL: Удаление определённого количества записей через процедуру
Всем привет. Мне необходимо написать процедуру, которая удаляет определённое количество строк, соответствующих заданному параметру (в нашем случае, устаревших). Пока получается так:
CREATE PROCEDURE PR$DELETE_OLD_VIDEO_TRANSLATION_STATISTICS(obsolescence_time DATETIME, insert_limit int) BEGIN START TRANSACTION; CREATE TEMPORARY TABLE batch_to_delete(id BIGINT(20) NOT NULL PRIMARY KEY); INSERT INTO batch_to_delete SELECT id FROM videotranslationlog WHERE created < obsolescence_time LIMIT insert_limit; DELETE l FROM videotranslationlog l JOIN batch_to_delete b ON (b.id = l.id); //здесь проблема COMMIT; END;
То есть, я беру первую, скажем, тысячу соответствующих параметрам записей и кладу их во временную таблицу. Потом я хочу удалить записи, id которых соответствуют id в таблице на удаление. Строка DELETE, мне кажется, удалит все записи вообще, потому что нет WHERE. Подскажите, как поправить скрипт, чтобы он работал, как я описал?
Отслеживать
задан 11 дек 2018 в 13:50
Вячеслав Чернышов Вячеслав Чернышов
2,655 2 2 золотых знака 18 18 серебряных знаков 42 42 бронзовых знака
Это Вам только кажется. Попробуйте на тестовой табличке.
11 дек 2018 в 13:52
то есть, должно отработать нормально? Мне тоже нравится, но Идея выделяет и ругается.
11 дек 2018 в 13:53
но Идея выделяет и ругается Ну синтаксис-то надо блюсти.
11 дек 2018 в 13:55
Хотя я лично не понимаю - почему нельзя сразу взять да удалить с LIMIT-ом?
11 дек 2018 в 13:56
По PRIMARY_KEY удаляется быстрее и меньше вероятностей, что остановит выполнение скрипта из-за какого-нибудь констрейта.
11 дек 2018 в 14:33
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.15.1019
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как вывести определенное количество строк sql
Для выборки определённого количества строк из таблицы в SQL используют оператор LIMIT .
Например, запрос приведённый ниже вернёт первые 100 записей из таблицы topics.
SELECT * FROM topics LIMIT 100;
Если же мы хотим пропустить какое-то количество записей и затем взять определённое количество, в связке с LIMIT используется еще и OFFSET .
SELECT * FROM topics LIMIT 100 OFFSET 20;
С помощью запроса выше мы получим 100 записей из таблицы topics, но при этом пропустим первые 20 строк.
Как удалить определенное количество строк в sql
DELETE — удалить записи таблицы
Синтаксис
[ WITH [ RECURSIVE ]запрос_WITH[, . ] ] DELETE FROM [ ONLY ]имя_таблицы[ * ] [ [ AS ]псевдоним] [ USINGэлемент_FROM[, . ] ] [ WHEREусловие| WHERE CURRENT OFимя_курсора] [ RETURNING * |выражение_результата[ [ AS ]имя_результата] [, . ] ]
Описание
Команда DELETE удаляет из указанной таблицы строки, удовлетворяющие условию WHERE . Если предложение WHERE отсутствует, она удаляет из таблицы все строки, в результате будет получена рабочая, но пустая таблица.
Подсказка
TRUNCATE — расширение PostgreSQL , реализующее более быстрый механизм удаления всех строк из таблицы.
Удалить строки в таблице, используя информацию из других таблиц в базе данных, можно двумя способами: применяя вложенные запросы или указав дополнительные таблицы в предложении USING . Выбор предпочитаемого варианта зависит от конкретных обстоятельств.
Предложение RETURNING указывает, что команда DELETE должна вычислить и возвратить значения для каждой фактически удалённой строки. Вычислить в нём можно любое выражение со столбцами целевой таблицы и/или столбцами других таблиц, упомянутых в USING . Список RETURNING имеет тот же синтаксис, что и список результатов SELECT .
Чтобы удалять данные из таблицы, необходимо иметь право DELETE для неё, а также право SELECT для всех таблиц, перечисленных в предложении USING , и таблиц, данные которых считываются в условии .
Параметры
запрос_WITH
Предложение WITH позволяет задать один или несколько подзапросов, на которые затем можно ссылаться по имени в запросе DELETE . Подробнее об этом см. Раздел 7.8 и SELECT . имя_таблицы
Имя (возможно, дополненное схемой) таблицы, из которой будут удалены строки. Если перед именем таблицы добавлено ONLY , соответствующие строки удаляются только из указанной таблицы. Без ONLY строки будут также удалены из всех таблиц, унаследованных от указанной. При желании, после имени таблицы можно указать * , чтобы явно обозначить, что операция затрагивает все дочерние таблицы. псевдоним
Альтернативное имя целевой таблицы. Когда указывается это имя, оно полностью скрывает фактическое имя таблицы. Например, в запросе DELETE FROM foo AS f дополнительные компоненты оператора DELETE должны обращаться к целевой таблице по имени f , а не foo . элемент_FROM
Табличное выражение, позволяющее добавить в условие WHERE столбцы из других таблиц. В этом выражении используется тот же синтаксис, что и в предложении Предложение FROM оператора SELECT ; например, в нём можно определить псевдоним для таблицы. Повторять в нём имя целевой таблицы нужно, только если требуется определить замкнутое соединение (в этом случае для данного имени должен определяться псевдоним). условие
Выражение, возвращающее значение типа boolean . Удалены будут только те строки, для которых это выражение возвращает true . имя_курсора
Имя курсора, который будет использоваться в условии WHERE CURRENT OF . С таким условием будет удалена строка, выбранная из этого курсора последней. Курсор должен образовываться запросом, не применяющим группировку, к целевой таблице команды DELETE . Заметьте, что WHERE CURRENT OF нельзя задать вместе с логическим условием. За дополнительными сведениями об использовании курсоров с WHERE CURRENT OF обратитесь к DECLARE . выражение_результата
Выражение, которое будет вычисляться и возвращаться командой DELETE после удаления каждой строки. В этом выражении можно использовать имена любых столбцов таблицы имя_таблицы или таблиц, перечисленных в списке USING . Чтобы получить все столбцы, достаточно написать * . имя_результата
Имя, назначаемое возвращаемому столбцу.
Выводимая информация
В случае успешного завершения, DELETE возвращает метку команды в виде
DELETE число
Здесь число — количество удалённых строк. Заметьте, что это число может быть меньше числа строк, соответствующих условию , если удаления были подавлены триггером BEFORE DELETE . Если число равно 0, это означает, что запрос не удалил ни одной строки (это не считается ошибкой).
Если команда DELETE содержит предложение RETURNING , её результат будет похож на результат оператора SELECT (с теми же столбцами и значениями, что содержатся в списке RETURNING ), полученный для строк, удалённых этой командой.
Замечания
PostgreSQL позволяет ссылаться на столбцы других таблиц в условии WHERE , когда эти таблицы перечисляются в предложении USING . Например, удалить все фильмы определённого продюсера можно так:
DELETE FROM films USING producers WHERE producer_id = producers.id AND producers.name = 'foo';
По сути в этом запросе выполняется соединение таблиц films и producers , и все успешно включённые в соединение строки в films помечаются для удаления. Этот синтаксис не соответствует стандарту. Следуя стандарту, эту задачу можно решить так:
DELETE FROM films WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
В ряде случаев запрос в стиле соединения легче написать и он может работать быстрее, чем в стиле вложенного запроса.
Примеры
Удаление всех фильмов, кроме мюзиклов:
DELETE FROM films WHERE kind <> 'Musical';
Очистка таблицы films :
DELETE FROM films;
Удаление завершённых задач с получением всех данных удалённых строк:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
Удаление из tasks строки, на которой в текущий момент располагается курсор c_tasks :
DELETE FROM tasks WHERE CURRENT OF c_tasks;
Совместимость
Эта команда соответствует стандарту SQL , но предложения USING и RETURNING являются расширениями PostgreSQL , как и возможность использовать WITH с DELETE .
| Пред. | Наверх | След. |
| DECLARE | Начало | DISCARD |
MySQL: DELETE удаление записи, TRUNCATE очистка данных таблицы
MySQL-инструкция DELETE удаляет строки из таблицы и возвращает количество удаленных строк. Чтобы проверить количество удаленных строк, необходимо вызвать функцию SELECT ROW_COUNT() . Аналогичная функция Python модуля MySQLdb - Cursor.rowcount .
Синтаксис инструкции DELETE .
-- удаление строк/записей из одной таблицы DELETE [IGNORE] FROM tbl_name [AS tbl_alias] WHERE condition ORDER BY . [ASC|DESC] LIMIT count
Комментарии к синтаксису DELETE :
- Условия в необязательном операторе WHERE определяют, какие строки следует удалить. ВНИМАНИЕ! При отсутствии предложения WHERE будут удалены ВСЕ строки. Условие condition - это выражение, которое принимает значение TRUE для каждой удаляемой строки. Дополнительно смотрите материал "Использование инструкции WHERE в запросах к БД MySQL"
- Если указана инструкция ORDER BY , то строки удаляются в указанном порядке. ORDER BY можно применить к удалениям из одной таблицы, но не поддерживает удаления из нескольких таблиц.
- Инструкция LIMIT устанавливает ограничение на количество строк, которые могут быть удалены. LIMIT можно применить к удалениям из одной таблицы, но не к удалениям из нескольких таблиц.
- Модификатор IGNORE заставляет MySQL игнорировать ошибки во время процесса удаления строк. (Ошибки, возникшие на этапе синтаксического анализа, обрабатываются обычным способом.) Ошибки, которые игнорируются из-за использования IGNORE , возвращаются как предупреждения.
Инструкция TRUNCATE TABLE является более быстрым способом очистки таблицы, чем оператор DELETE без предложения WHERE . В отличие от DELETE , инструкцию TRUNCATE TABLE нельзя использовать внутри транзакции и при блокировке таблицы.
Использование WHERE при удалении записей.
Условия WHERE определяет, какие строки следует удалить, а при его отсутствии будут удалены ВСЕ строки. Условие condition - это выражение, которое принимает значение TRUE для каждой удаляемой строки.
Например стоит задача: удаления записей о продажах за определенное число или очистка старых (ненужных) данных из таблицы sales :
-- удаление старых (ненужных) записей о продажах до '2001-07-09' DELETE FROM sales WHERE date_sales '2001-07-09'; -- удаления записей о продажах за сегодня DELETE FROM sales WHERE date_sales=NOW();
Использование инструкции ORDER BY и LIMIT .
Инструкции ORDER BY и LIMIT можно использовать, если при удалении данных необходимо оставить какое то определенное количество строк новых записей.
-- подсчитываем кол-во строк в таблице `logs` SET @count = SELECT count(id) FROM logs; -- удаляем все, кроме 500 последних добавленных строк DELETE FROM logs WHERE @count > 500 ORDER BY id ASC LIMIT @count - 500;
Или, наверное, можно так (не проверяли):
-- оставит последние 500 строк, если журнал -- таблицы `logs` не превышает 10000000 записей DELETE FROM logs ORDER BY id DESC LIMIT 500, 10000000;
Более подробно об использование инструкций ORDER BY и LIMIT смотрите в материале "Составление запросов SELECT к БД MySQL"
Удаление записей из нескольких таблиц.
Удаление информации - вещь ответственная. Неправильно поставленный запрос может обернуться потерей критических данных. Рекомендуем редко пользоваться запросами DELETE из нескольких таблиц. Если такой запрос необходим в целях оптимизации производительности, сначала постройте подобный запрос с использованием инструкции SELECT , а потом просто замените SELECT на DELETE , а также уберите из запроса извлекаемые столбцы.
-- проверочный запрос `SELECT` SELECT tbl_a.col, tbl_b.col FROM tbl_a , tbl_b USING tbl_a.id = tbl_b.id WHERE condition -- если проверочный запрос выдал -- те строки, которые необходимо удалить, -- то переделываем его на `DELETE` DELETE FROM tbl_a , tbl_b USING tbl_a.id = tbl_b.id WHERE condition
TRUNCATE TABLE полная очистка таблицы MySQL.
Пример очистки таблицы animals от всех записей:
TRUNCATE TABLE animals
Хотя TRUNCATE TABLE похож на инструкцию DELETE , он отличается следующим:
- Операции TRUNCATE удаляют и заново создают таблицу, что намного быстрее, чем удаление строк по одной, особенно для больших таблиц.
- Операции TRUNCATE вызывают неявную фиксацию, поэтому их нельзя откатить.
- Операции TRUNCATE не могут быть выполнены, если сеанс удерживает активную блокировку таблицы.
- TRUNCATE TABLE терпит неудачу для таблицы InnoDB, если есть какие-либо ограничения FOREIGN KEY из других таблиц, которые ссылаются на таблицу. Допускаются ограничения внешнего ключа между столбцами одной и той же таблицы.
- Операции TRUNCATE не возвращают значимого значения количества удаленных строк. Обычный результат - "0 rows affected", что следует интерпретировать как "нет информации".
- Любое значение AUTO_INCREMENT сбрасывается до своего начального значения. Это верно даже для MyISAM и InnoDB, которые обычно не используют повторно значения последовательности.
- Оператор TRUNCATE TABLE не вызывает триггеры ON DELETE , установленные для внешнего ключа FOREIGN KEY .
- КРАТКИЙ ОБЗОР МАТЕРИАЛА.
- Функция connect() модуля MySQLdb
- Методы объекта Cursor модуля MySQLdb
- Исключения, определяемые модулем MySQLdb
- Реализация интерфейса MySQL C API в модуле MySQLdb Python
- Подмодуль times модуля MySQLdb
- Подмодуль converters модуля MySQLdb
- MySQL: Типы хранимых данных
- MySQL: CONVERT() и CAST(), преобразование типов
- MySQL: Неявные преобразования типов в вычислениях
- MySQL: Функции для работы со строками
- MySQL: Функции для работы с датой и временем
- MySQL: Временные интервалы и арифметика с датами
- MySQL: Математические функции
- MySQL: Агрегатные (групповые) функций
- MySQL: SELECT cоставление запросов
- MySQL: CASE и IF() в запросах SELECT
- MySQL: Поиск по шаблону, LIKE в запросах SELECT
- MySQL: Поиск по регулярному выражению
- MySQL: Использование WHERE в запросах
- MySQL: Использование GROUP BY и HAVING
- MySQL: LEFT JOIN и INNER JOIN объединение таблиц
- MySQL: UNION объединение запросов
- MySQL: UPDATE обновление данных таблицы
- MySQL: INSERT/REPLACE добавление данных в таблицу
- MySQL: DELETE/TRUNCATE удаление записи/очистка данных таблицы
- MySQL: CREATE TABLE создание таблиц
- Импорт CSV-файла в MySQL таблицу, экспорт данных в CSV
- MySQL: ALTER TABLE изменение таблицы
- MySQL: Хранимые процедуры и функции
- MySQL: События EVENT и планировщик событий
- MySQL: CREATE/ALTER USER и права GRANT/ROLE
- MySQL: Сброс пароля root на ОС Linux/Windows
- Логирование ВСЕХ и/или МЕДЛЕННЫХ запросов к БД MYSQL
- Кэширование запросов на MySQL-сервере
- Как конвертировать БД MySQL в требуемую кодировку
