在MySQL中不存在时执行SELECT并插入

时间:2019-02-27 23:45:45

标签: mysql sql

我有一个使用以下语法创建的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 :(得分:1)

正如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 ;

Demo on 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 ;

Demo on DB Fiddle

答案 1 :(得分:0)

您可以在存储的proc上执行此操作,如果select语句未返回结果,则可以执行insert语句