在MySQL中不存在时执行选择但插入

在MySQL中不存在时执行选择但插入,mysql,sql,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`) ); 这个表想要回答的一个常见查询是从名称到id的查找,但是如果数据库中不存在该对,那么还要插入一个新条目并返回新插入的id 我可以知

我使用以下语法创建了一个MySQL表:

CREATE TABLE `name_to_id` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(128),
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
);
这个表想要回答的一个常见查询是从名称到id的查找,但是如果数据库中不存在该对,那么还要插入一个新条目并返回新插入的id


我可以知道我应该在MySQL中这样做吗?

您可以在存储过程中这样做,如果select语句没有返回结果,那么您可以执行insert语句,正如草莓所评论的那样,这不能在单个查询中执行

但是,这里有一个存储过程,它应该执行您所期望的操作。首先,它使用插入。。。在重复键上更新语法以插入新名称;这实际上取决于在“名称”列上正确设置的唯一键

这种方法是有效的,但使用重复键的缺点是它浪费了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 ;

.

在单个查询中?没有。但是你可以创建一个程序。你尝试过什么?这是一种常见的模式,你应该告诉他上次插入的ID,以获取新插入记录的ID。我认为OP需要的是一个函数,而不是一个过程。否则我绝对同意你的第二个版本。@Nick:可能太。。。很难说,因为OP目前似乎没有反应。谢谢你的回答。我个人更喜欢第二种解决方案。至于第一个解决方案,它保证能读你自己写的东西吗?@keelar:你说读你自己写的东西是什么意思?PS:我为这两种解决方案都提供了小提琴,您可以四处玩,看看程序是如何运行的。
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 ;