在MySQL中不存在时执行选择但插入
我使用以下语法创建了一个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 我可以知
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 ;