Как прокомментировал 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 .