Вставить в, если не существует, не вставляя - PullRequest
1 голос
/ 06 июня 2019
INSERT INTO my_table (field_1, field_2)
SELECT val_1, val_2     
FROM my_table
WHERE NOT EXISTS (SELECT field_1
                        FROM my_table
                        WHERE field_2 = val_2)
LIMIT 1

Я не могу использовать уникальный индекс в поле field_2. Я пытаюсь вставить, если не существует кортеж с field2 = val_2. Без предложения "where" эта вставка. С предложением "where" ДАЖЕ, КОГДА ПУСТОЙ СТОЛ не вставляется.

Есть какая-нибудь помощь по этому поводу?

Ответы [ 3 ]

0 голосов
/ 06 июня 2019

Полагаю, val_1 и val_2 не являются столбцами таблицы, верно?
Это значения, которые вы хотите вставить в таблицу.
Итак, капля:

FROM my_table

и использование:

INSERT INTO my_table (field_1, field_2)
SELECT val_1, val_2     
WHERE NOT EXISTS (
  SELECT field_1
  FROM my_table
  WHERE field2 = val_2
)
0 голосов
/ 06 июня 2019

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

create unique index unq_my_table_field_2 on my_table(field_2);

Затем игнорируйте ошибку, используя on duplicate key update:

INSERT INTO my_table (field_1, field_2)
    VALUES (val_1, val_2)
    ON DUPLICATE KEY UPDATE field_2 = VALUES(val_2);   -- this is a no-op, because the value is already the same

Тот факт, что ваш код не работает с пустой таблицей, не имеет ничего общего с предложением WHERE, но с использованием from my_table в предложении from. Если строк нет, запрос возвращается. , , нет строк. Не удивительно, что ничего не вставлено.

0 голосов
/ 06 июня 2019

Решение состоит в том, чтобы проверить, существует ли ключ:

INSERT INTO my_table (field_1, field_2) ON DUPLICATE KEY INSERT IGNORE.

этот вопрос может быть полезным.

...