Вставить строку в таблицу, если значение столбца еще не существует в таблице

0

У меня есть следующий запрос:

INSERT INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")

Я хочу вставить строку только в том случае, если не существует строки, которая уже имеет code="uniquecode"

Как я могу это сделать?

Я нашел несколько решений, связанных с INSERT IGNORE, что-то о DUAL и еще несколько, но я не понял, что касается моей ситуации.

Если это имеет значение, я использую pymysql.

  • 2
    Вы можете изменить свою таблицу, чтобы столбец code имел уникальный индекс. Таким образом вы получите ошибку в случае дублирования записи.
  • 0
    @dashboard Я использовал ваше решение
Теги:

3 ответа

2
Лучший ответ

Лучший способ сделать это используется on duplicate key update:

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

Во-вторых:

INSERT INTO LICENSE_TABLE (code, license_type, distributor)
    VALUES ('uniquecode', 'standard', 'walmart')
    ON DUPLICATE KEY UPDATE code = VALUES(code);

Это лучше, чем подзапрос WHERE с EXISTS потому что он потокобезопасен. Это означает, что несколько обновлений в разных потоках никогда не вызовут проблемы.

Это лучше, чем INSERT IGNORE потому что INSERT IGNORE игнорирует другие ошибки. ON DUPLICATE KEY UPDATE делает именно то, что вы хотите.

1

Сначала вы должны создать UNIQUE INDEX в столбце кода. Затем вы можете безопасно вставлять данные без предупреждений, используя:

INSERT INTO LICENSE_TABLE(code, license_type, distributor)
SELECT 'uniquecode', 'standard', 'walmart'
FROM (SELECT 1) AS x
WHERE NOT EXISTS (
    SELECT 1
    FROM LICENSE_TABLE
    WHERE code = 'uniquecode'
)
  • 0
    @ user1283776. , , Это не потокобезопасно. Два потока могут попытаться вставить одно и то же значение одновременно, что приведет к ошибке. Лучший ответ - INSERT IGNORE . Лучший ответ - ON DUPLICATE KEY UPDATE .
  • 0
    @GordonLinoff почему бы не быть потокобезопасным? Это один запрос. Почему вменяемый сервер базы данных чередует выполнение?
Показать ещё 3 комментария
0

Просто используйте INSERT IGNORE как

INSERT IGNORE INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")

Но вам нужно иметь уникальный индекс в столбце code. Проверьте, есть ли у вас один show indexes from LICENSE_TABLE; или show create table LICENSE_TABLE;

Если у вас его нет, вы можете создать его так:

create unique index uidx_license_table_code on LICENSE_TABLE(code);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню