Вставить строку в таблицу, если значение столбца еще не существует в таблице - PullRequest
0 голосов
/ 12 сентября 2018

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

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Сначала вы должны создать 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 голосов
/ 12 сентября 2018

Лучший способ сделать это использует 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 делает именно то, что вы хотите.

0 голосов
/ 12 сентября 2018

Просто используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...