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

Первые пять пользователей пометить как удаленные mysql

  • автор:

mysql — пометить все записи, кроме 1, соответствующие нескольким полям (рядом с дубликатами), как удаленные

У меня есть таблица mysql для товаров в корзине. Мне нужно пометить любые дубликаты одного и того же элемента как удаленные (путем ввода метки времени в столбце «удалено», а не для фактического удаления по причинам контрольного журнала).

Столбцы таблицы (order_item):

Я хочу обновить все элементы в таблице, кроме одного, которые являются дубликатами (имеют те же значения, что и другая строка), чтобы в столбцах, отмеченных знаком *, было текущее значение даты и времени в удаленном столбце. Таким образом, за один раз можно приобрести только 1 одинаковый товар.

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

Есть ли надежный способ сделать все это одним запросом?

2 ответа

Я думаю, вы можете реализовать логику с обновлением и самостоятельным присоединением:

Подзапрос вычисляет минимум id для каждого кортежа значений. Затем внешний запрос устанавливает столбец deleted для строк, которые совпадают в кортеже и чье id не является минимальным.

При этом обрабатываются все заказы сразу. Вы можете добавить фильтр в предложение where внешнего запроса для обработки только одного заказа. Вы также можете изменить агрегатную функцию на что-то другое, если хотите (может быть, вы хотите max(id) вместо min(id) ).

Примечание. Это решение не работает в MySQL. См. Комментарии ниже. Я оставляю это в надежде, что это может помочь кому-то, кто использует другую СУБД в будущем.

Просто удалите элементы в том же порядке с датой создания после той, которую вы рассматриваете. Я не совсем уверен в синтаксисе MySQL, но он выглядит примерно так:

Я использовал те же ограничения, что и ваш запрос.

Вы можете удалить строку AND ORDER = ID , чтобы очистить все заказы сразу.

Возможно, ограничение на price_id, type и timeslot_id не требуется (при условии, что идентификатор элемента подразумевает эти атрибуты).

пометить запись как удаляемую вместо удаления записи из таблицы mysql

Я хочу знать, как перейти к записи флага как удаленные, а не физически удалять запись из базы данных. Раньше я никогда такого не встречал. Есть ли какой-нибудь учебник, которому я могу следовать?

3 ответа

Используйте дополнительное логическое поле в таблице, чтобы указать, действительна ли запись или нет.

Действителен = 1, то он присутствует.

Действителен = 0, затем он удаляется.

Самый простой способ — добавить новый столбец BOOL в таблицу, как enabled со значением по умолчанию 1 .

Затем UPDATE table_name SET enabled = 0 когда вы хотите «удалить» строку.

И отфильтруйте «удаленные» строки в ваших запросах, например:

SELECT * FROM table_name WHERE. AND enabled = 1

В MySQL нет ничего, что могло бы помечать запись как удаленную, но вы можете добавить свой собственный столбец для описания состояния — вам просто нужно не забыть исключить его из ваших запросов. Усложнение возникает, когда вы пытаетесь вставить строку с уникальными/первичными ключами, соответствующими вашей удаленной записи; вам нужно добавить триггер для изменения состояния. На самом деле более простой вариант — просто удалить данные в первую очередь (вы не говорите, чего вы пытаетесь достичь, не удаляя строку)

Примеры SQL запросов к базе данных MySQL


Содержание статьи
1. Самые простые MySQL запросы
2. Простые SELECT (выбрать) запросы
3. Простые INSERT (новая запись) запросы
4. Простые UPDATE (перезаписать, дописать) запросы
5. Простые DELETE (удалить запись) запросы
6. Простые DROP (удалить таблицу) запросы
7. Сложные MySQL запросы
8. MySQL запросы и переменные PHP

1. Самые простые SQL запросы

1. Выведет список ВСЕХ баз.

2. Выведет список ВСЕХ таблиц в Базе Данных base_name.

2. Простые SELECT (выбрать) запросы к базе данных MySQL

SELECT – запрос, который выбирает уже существующие данные из БД. Для выбора можно указывать определённые параметры выбора. Например, суть запроса русским языком звучит так — ВЫБРАТЬ такие-то колонки ИЗ такой-то таблицы ГДЕ параметр такой-то колонки равен значению.

1. Выбирает ВСЕ данные в таблице tbl_name.

2. Выведет количество записей в таблице tbl_name.

3. Выбирает (SELECT) из(FROM) таблицы tbl_name лимит (LIMIT) 3 записи, начиная с 2.

4. Выбирает (SELECT) ВСЕ (*) записи из (FROM) таблицы tbl_name и сортирует их (ORDER BY) по полю id по порядку.

5. Выбирает (SELECT) ВСЕ записи из (FROM) таблицы tbl_name и сортирует их (ORDER BY) по полю id в ОБРАТНОМ порядке.

6. Выбирает (SELECT) ВСЕ (*) записи из (FROM) таблицы users и сортирует их (ORDER BY) по полю id в порядке возрастания, лимит (LIMIT) первые 5 записей.

7. Выбирает все записи из таблицы users, где поле fname соответствует значению Gena.

8. Выбирает все записи из таблицы users, где значение поля fname начинается с Ge.

9. Выбирает все записи из таблицы users, где fname заканчивается на na, и упорядочивает записи в порядке возрастания значения id.

10. Выбирает все данные из колонок fname, lname из таблице users.

Внимание! Старайтесь указывать конкретные колонки (как в примере 10). Это важно для того, чтобы запросы обрабатывались намного быстрее!

11. Допустим у Вас в таблице пользовательских данных есть страна. Так вот если Вы хотите вывести ТОЛЬКО список встречающихся значений (чтобы, например, Россия не выводилось 20 раз, а только один), то используем DISTINCT. Выведет, из массы повторяющихся значений Россия, Украина, Беларусь. Таким образом, из таблицы users колонки country будут выведены ВСЕ УНИКАЛЬНЫЕ значения

12. Выбирает ВСЕ данные строк из таблицы users где age имеет значения 18,19 и 21.

13. Выбирает МАКСИМАЛЬНОЕ значение age в таблице users. То есть если у Вас в таблице самое большее значение age(с англ. возраст) равно 55, то результатом запроса будет 55.

14. Выберет данные из таблицы users по полям name и age ГДЕ age принимает самое маленькое значение.

15. Выберет данные из таблицы users по полю name ГДЕ id НЕ РАВЕН 2.

3. Простые INSERT (новая запись) запросы

INSERT – запрос, который позволяет ПЕРВОНАЧАЛЬНО вставить запись в БД. То есть создаёт НОВУЮ запись (строчку) в БД.

1. Делает новую запись в таблице users, в поле name вставляет Сергей, а в поле age вставляет 25. Таким образом, в таблицу дописывается новая строки с данными значениями. Если колонок больше, то они оставшиеся останутся либо пустыми, либо с установленными по умолчанию значениями.

4. Простые UPDATE запросы к базе данных MySQL

UPDATE – запрос, который позволяет ПЕРЕЗАПИСАТЬ значения полей или ДОПИСАТЬ что-то в уже существующей строке в БД. Например, есть готовая строка, но в ней нужно перезаписать параметр возраста, так как он изменился со временем.

1. В таблице users ГДЕ id равно 3 значение поля age становится 18.

2. Всё то же самое, что и в первом запросе, просто показан синтаксис запроса, где перезаписываются два поля и более.
В таблице users ГДЕ id равно 3 значение поля age становится 18, а country Россия.

5. Простые DELETE (удалить запись) запросы к базе данных MySQL

DELETE – запрос, который удаляет строку из таблицы.

1. Удаляет строку из таблицы users ГДЕ id равен 10.

6. Простые DROP (удалить таблицу) запросы к базе данных MySQL

DROP – запрос, который удаляет таблицу.

1. Удаляет целиком таблицу tbl_name.

7. Сложные запросы к базе данных MySQL

Любопытные запросы, которые могут пригодиться даже опытным пользователям

Данный сложный запрос ВЫБИРАЕТ колонки id,name,country В ТАБЛИЦАХ users,admins ГДЕ registration_date (дата) не старше 14 дней И activation НЕ РАВНО 0, СОРТИРОВАТЬ по registration_date в обратном порядке (новое в начале).

Выше указан пример так называемого запроса в запросе в SQL. Обновить возраст среди пользователей на 18+, где пол — мужской. Подобные варианты запроса не рекомендую. По личному опыту скажу, лучше создать несколько отдельных — они будут прорабатываться быстрее.

8. Запросы к базе данных MySQL и PHP

В MySQL запросы в PHP странице можно вставлять переменные в качестве сравниваемых и тп значений. Пара примеров

1. Выбирает все записи из таблицы users, где поле fname соответствует значению переменной $name.

2. В таблице users ГДЕ id равно 3 значение поля age изменяется на значение переменной $age.

Внимание! Если Вам интересен какой-либо ещё пример, то пишите вопрос в комментарии!

Как правильнее поступать с ненужными записями в БД — удалять или помечать их флагом "deleted"?

Как правильнее и оптимальнее сделать, если удаляться записи будут немного, но регулярно?

  • Вопрос задан более трёх лет назад
  • 10820 просмотров
  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter

Запсись БД делается, грубо говоря, в файл. Если запись физически из файла удалить, нужно произвести операцию по усечению файла и его перезаписи, что на многих файловых системах и СУБД — ресурсозатратная (и опасная — вдруг сбой?) операция, поэтому ее стараются избегать. Плюс часто при перезаписи (оптимизации) БД становится недоступна совсем или для некоторых операций, что тоже нехорошо. Отсюда пошла практика пометок «удаленными». Решайте сами, исходя из задачи и необходимости.

Встречал как-то альтерантивный вариант: периодический слив БД в дамп без «помеченных» записей и замена им старой БД. Благодаря тому, что чтение дампа происходило без остановки работы, а заливка нового была достаточно быстрой, решение жило и было приемлемым. Побочный продукт — бекапы.

  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter
  • Facebook
  • Вконтакте
  • Twitter

Вы хотели сказать myisam?

То есть всё равно всё сводится к физическому удалению — сразу или по крону — зависит от размера базы и нагруженности.

Да, я имел в виду тип таблиц MyISAM. На работе закрутился.

Физическое удаление из этого типа таблиц (даже, если мы удали 1 строку) снижает скорость работы таблицы, до того момента, как мы не проведём оптимизацию.
Для InnoDB физическое удаление практически не критично.

Ответы очевидны.
Помечать флагом — растет база, удалять — понижение производительности (фрагментация, сама операция удаления может оказаться дорогой) и часто усложнение бизнеслогики.

Я бы не рекомендовал удалять данные из сложных баз данных, особенно если это справочники, например выставив в freign key — RESTRICT, чтобы разрешить удаление только для ‘свободных’ записей. Удаление записей в сложных базах данных, обычно очень сложная операция, обычно перед этим приходится проводить кучу проверок и изменений для связанных данных, поэтому флаг ‘deleted’ используется как упрощение или даже часть механизма для введения временной составляющей в хранение данных (база данных может являться как средством для хранения текущего состояния, так и для хранения лога изменений данных во времени)

В зависимости от задач:
1. Если удаление происходит сравнительно редко, т.е. если оверхед на размер базы незначителен — то лучше помечать флагом.
2. Если удаления и создания записей очень частые (в результате база не очень растет), то лучше удалять, плюсы от отсутствия фрагментации может оказаться недостаточным, чтобы перебить рост индексов (кстати и кэш в оперативной памяти будет зря занят).
3. Если и скорость и данные критичны, то лучше помечать флагом и удалять по крону, а чтобы минимизировать вероятность задержек на время обслуживания — разделить таблицу на кластеры (можно ‘вручную’ в классе работы с БД) и очищать каждый кусок отдельно, а разделение сделать с целью отделить часто используемые данные от редко используемых.

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

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