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

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

  • автор:

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 не требуется (при условии, что идентификатор элемента подразумевает эти атрибуты).

База данных: помечать объект (запись) как удаленный для определенных пользователей

Учитывая таблицу базы данных с записями, которые могут видеть несколько пользователей в приложении, каков наиболее эффективный способ пометить запись, удаленную для нескольких пользователей, без фактического удаления самой записи (мягкое удаление)?

Требования:

    Несколько пользователей должны иметь возможность отмечать запись как удаленную Когда пользователь A отмечает запись как удаленную, пользователь B, C, D. должен все еще видеть это, пока они не помечают ее как удаленные сами Административный пользователь должен иметь возможность отмечать запись как удаленную, чтобы запись больше не отображалась для других.

Я подумал о следующем примере, но мне любопытно посмотреть, что будут делать другие программисты.

Таблица: объект

Административный пользователь может установить active флаг в 0, чтобы эффективно удалить запись из области всех пользователей.

Таблица: entity_deleted_user

Есть ли более эффективный способ сделать это?

То, что вы описали, — это как сделать это реляционным способом. Фактически это сопоставление «один ко многим»: вы пытаетесь сопоставить состояние одного элемента (объекта) со многими (пользователями). Способность администратора переопределять статус применяется только к объекту, поэтому он должен находиться в таблице сущностей.

Альтернативным -and нереляционным методом может быть использование единственного целочисленного поля в качестве бит, установленного в таблице сущности, причем каждый бит представляет состояние удаленных объектов для отдельного пользователя. Это устранило бы необходимость в таблице entity_deleted_user (и администратор мог бы просто установить все биты, чтобы скрыть ее от всех), но эта схема имеет много недостатков (ограниченное количество пользователей, отсутствие ссылочной целостности и т.д.).

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

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

3 ответа

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

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

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

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

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

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

SELECT * FROM table_name WHERE. AND enabled = 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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