Nano Hash - криптовалюты, майнинг, программирование

Уникально вставить в таблицу MySQL без уникальных ключей

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

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

Я хотел бы выполнить проверку и операцию INSERT в одной команде SQL. Может кто-то указать мне верное направление?

27.06.2011

  • Используете ли вы ключ в своей таблице? Вы можете использовать «Вставить дубликат ключа». dev.mysql.com/doc/refman/5.0/ ru/insert-on-duplicate.html 27.06.2011
  • @Tim, для этого требуется уникальный ключ, а @Björn Marschollek говорит, что не может добавить такой ключ. 27.06.2011
  • Почему вы не можете изменить таблицу, это лучший способ сделать это. Любой другой способ - это хак, что, если что-то плохое произойдет во время выполнения вашего запроса после достижения блокировки и не освободит блокировку, ничто другое не сможет вставить в нее. 27.06.2011

Ответы:


1

Предположим, у вас в таблице 5 столбцов — col1, col2, col3, col4, col5. И предположим, что данные, соответствующие этим столбцам, которые вы пытаетесь вставить, находятся в переменных - $col1, $col2, $col3, $col4, $col5 (я предполагаю, что PHP является вашим языком, но, пожалуйста, измените формат переменных в соответствии с ваша номенклатура).

Таким образом, ваша вставка может выглядеть так:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE NOT EXISTS (SELECT 1
    FROM `tableA`
    WHERE `col1` = $col1
    AND `col2` = $col2
    AND `col3` = $col3
    AND `col4` = $col4
    AND `col5` = $col5);

Другой альтернативой может быть:

INSERT INTO `tableA` (`col1`, `col2`, `col3`, `col4`, `col5`)
SELECT $col1, $col2, $col3, $col4, $col5
FROM `tableA`
WHERE `col1` = $col1
AND `col2` = $col2
AND `col3` = $col3
AND `col4` = $col4
AND `col5` = $col5
HAVING COUNT(1) = 0;

Надеюсь это поможет.

27.06.2011
  • Будет ли это работать в транзакции с зафиксированным уровнем изоляции чтения? 11.08.2019

  • 2

    Вы можете использовать блокировку таблицы с запросом, и пока ваш запрос не завершит обработку, никакой другой процесс не изменит его.

    Проверьте эту ссылку: http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

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

    27.06.2011
  • статья про MSSQL, а вопрос про MySQL 27.06.2011
  • Обратите внимание, что вы должны быть очень строгими в тестировании, чтобы гарантировать, что таблица не будет заблокирована навсегда, или что ваши SELECT + INSERT не будут блокировать таблицу в течение нескольких часов. 27.06.2011

  • 3

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

    27.06.2011
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..