Предотвратить автоинкремент на вставку дубликата MySQL с несколькими значениями - PullRequest
0 голосов
/ 07 мая 2018

Существует ли общепринятая практика массовой вставки значений, которые не существуют в таблице, без автоинкремента при попытке вставить уже существующую строку?

Отличный ответ для случая вставки из одной строки: Запрет автоматического увеличения при вставке дубликата MySQL

Однако для эффективности вставки я бы хотел вставить большое количество строк с помощью одной команды SQL. (т.е.: вставьте в myBigTable VALUES ((value1_row1, value2_row1), (value1_row2, value2_row2) ...)

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ: Я хотел бы, чтобы все идентификаторы были доступны, поскольку моя таблица потенциально может стать очень большой. Изменение размера переменной auto_increment на BIGINT будет последним средством. Мое приложение вставки будет пытаться вставлять большое количество уже существующих строк на регулярной основе (например, обновления цен на акции), поэтому у меня будет пропущено большое количество автоматически увеличенных идентификаторов.

ПОЧЕМУ Я ИСПОЛЬЗУЮ AUTO-INCREMENT: Я считаю, что для скорости запросов я должен использовать целочисленный индекс в моей (очень большой) таблице в качестве первичного ключа вместо комбинации строковых полей. Я также считаю, что я должен использовать auto_increment, поэтому MySQL обрабатывает параллелизм для меня.

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете использовать технику в другом вопросе, используя UNION запрос:

INSERT INTO yourTable (col1, col2, ...)
SELECT $row1_value1, $row1_value2, ...
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1
    FROM yourTable
    WHERE unique_col = $row1_value1)
UNION ALL
SELECT $row2_value1, $row2_value2, ...
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1
    FROM yourTable
    WHERE unique_col = $row2_value1)
UNION ALL
SELECT $row3_value1, $row3_value2, ...
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1
    FROM yourTable
    WHERE unique_col = row1_value1)
UNION ALL
SELECT $row4_value1, $row4_value2, ...
FROM DUAL
WHERE NOT EXISTS (
    SELECT 1
    FROM yourTable
    WHERE unique_col = $row4_value1)
...