У меня есть следующий запрос:
INSERT INTO LICENSE_TABLE
(code, license_type, distributor)
values ("uniquecode", "standard", "walmart")
Я хочу вставить строку только в том случае, если не существует строки, которая уже имеет code="uniquecode"
Как я могу это сделать?
Я нашел несколько решений, связанных с INSERT IGNORE
, что-то о DUAL
и еще несколько, но я не понял, что касается моей ситуации.
Если это имеет значение, я использую pymysql
.
Лучший способ сделать это используется 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
делает именно то, что вы хотите.
Сначала вы должны создать 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'
)
INSERT IGNORE
. Лучший ответ - ON DUPLICATE KEY UPDATE
.
Просто используйте 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);
code
имел уникальный индекс. Таким образом вы получите ошибку в случае дублирования записи.