MySQL/MariaDB: это самый эффективный способ вставки уникальных значений и возврата неуникальных значений?

У меня был оператор в PSQL, который сделал это просто отлично (на основе ответа из потока это) Но я пытался воссоздать тот же оператор в MySQL, что было сложно. Мой текущий обходной путь уродлив:

    CREATE TEMPORARY TABLE potential_duplicates (
        id VARCHAR(64)
        content TEXT,
    
    ) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
    INSERT INTO potential_duplicates(id, content) VALUES ('1', 'some content'), ('2', 'some more content');
    SELECT id, content FROM potential_duplicates WHERE id IN (SELECT id FROM main_table);
    INSERT INTO main_table(id, content)
       SELECT id, content FROM potential_duplicates WHERE id NOT IN (SELECT id FROM main_table);

Этот запрос будет использоваться очень часто, и я чувствую, что создание временной таблицы для каждого запроса неэффективно. Первоначально я пытался найти способ использовать функцию INSERT ON DUPLICATE. Это сработало бы нормально, если бы я просто вставлял и ничего больше, но в конце мне нужно вернуть повторяющиеся значения.

Вы используете MySQL или MariaDB? Какая версия?

Nick 22.03.2022 01:36

@Ник, использующий MariaDB 10.7.3

Vincent Lauffer 22.03.2022 03:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что id является первичным ключом (или, по крайней мере, уникальным), вы можете использовать INSERT IGNORE, чтобы избежать дубликатов, и RETURNING (доступно начиная с MariaDB 10.5), чтобы вернуть вставленные значения id:

INSERT IGNORE main_content(id, content) 
VALUES ('2', 'some content'), ('5', 'some more content')
RETURNING id

Демо на dbfiddle

ВАУ это намного лучше! Я думал, что возврат вернет все значения, но рад узнать, что это не так.

Vincent Lauffer 22.03.2022 05:02

@VincentLauffer, в документах говорится, что он возвращает значения из «вставленных» строк, но я согласен, что неясно, имеют ли они в виду строки, которые были фактически вставлены, или те, которые находятся во вставке.

Nick 22.03.2022 22:19

Другие вопросы по теме