У меня был оператор в 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
. Это сработало бы нормально, если бы я просто вставлял и ничего больше, но в конце мне нужно вернуть повторяющиеся значения.
@Ник, использующий MariaDB 10.7.3
Предполагая, что id
является первичным ключом (или, по крайней мере, уникальным), вы можете использовать INSERT IGNORE
, чтобы избежать дубликатов, и RETURNING
(доступно начиная с MariaDB 10.5), чтобы вернуть вставленные значения id
:
INSERT IGNORE main_content(id, content)
VALUES ('2', 'some content'), ('5', 'some more content')
RETURNING id
ВАУ это намного лучше! Я думал, что возврат вернет все значения, но рад узнать, что это не так.
@VincentLauffer, в документах говорится, что он возвращает значения из «вставленных» строк, но я согласен, что неясно, имеют ли они в виду строки, которые были фактически вставлены, или те, которые находятся во вставке.
Вы используете MySQL или MariaDB? Какая версия?