Перейти к содержимому

Как удалить определенное количество строк в sql

  • автор:

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 :
  1. Условия в необязательном операторе WHERE определяют, какие строки следует удалить. ВНИМАНИЕ! При отсутствии предложения WHERE будут удалены ВСЕ строки. Условие condition - это выражение, которое принимает значение TRUE для каждой удаляемой строки. Дополнительно смотрите материал "Использование инструкции WHERE в запросах к БД MySQL"
  2. Если указана инструкция ORDER BY , то строки удаляются в указанном порядке. ORDER BY можно применить к удалениям из одной таблицы, но не поддерживает удаления из нескольких таблиц.
  3. Инструкция LIMIT устанавливает ограничение на количество строк, которые могут быть удалены. LIMIT можно применить к удалениям из одной таблицы, но не к удалениям из нескольких таблиц.
  4. Модификатор 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 в требуемую кодировку

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

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