Выполнение SELECT, но INSERT, когда не существует в MySQL - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть таблица MySQL, созданная с использованием следующего синтаксиса:

CREATE TABLE `name_to_id` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(128),
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
);

И общий запрос, на который эта таблица хотела бы ответить, это поиск от name до id, но если <name, id> пара не существует в БД, затем также вставьте новую запись и верните вновь вставленную id.

Могу ли я узнать, следует ли мне это делать в MySQL?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Как прокомментировал Strawberry, это не может быть выполнено в одном запросе.

Однако, здесь есть хранимая процедура, которая должна делать то, что вы ожидаете.Во-первых, он использует синтаксис INSERT ... ON DUPLICATE KEYS UPDATE для вставки новых имен;на самом деле это зависит от ключа UNIQUE, который вы правильно установили в столбце name.

DELIMITER //
CREATE PROCEDURE get_id_by_name(IN  p_name VARCHAR(128))
BEGIN
    INSERT INTO name_to_id(name) VALUE(p_name) ON DUPLICATE KEY UPDATE name = p_name;
    SELECT id FROM name_to_id WHERE name = p_name;
END //
DELIMITER ;

Демонстрация на DB Fiddle .


Этот подход эффективен, но недостатком ON DUPLICATE KEYS является то, что он растрачивает id последовательностей: каждый раз, когда вызывается запрос, последовательность автоматически внедряется (даже если запись уже существует).Это можно увидеть в скрипке.

Вот еще один подход, который не будет записывать порядковые номера:

DELIMITER //
CREATE PROCEDURE get_id_by_name(IN  p_name VARCHAR(128))
BEGIN
    DECLARE p_id bigint(20) unsigned;
    SELECT id INTO p_id FROM name_to_id WHERE name = p_name;
    IF (p_id IS NULL) THEN
        INSERT INTO name_to_id(name) VALUE(p_name);
        SELECT LAST_INSERT_ID();
    ELSE 
        SELECT p_id;
    END IF;
END //
DELIMITER ;

Демонстрация на DB Fiddle .

0 голосов
/ 28 февраля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...