我有一个使用以下语法创建的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中知道吗?
答案 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 ;
这种方法是有效的,但是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 ;
答案 1 :(得分:0)
您可以在存储的proc上执行此操作,如果select语句未返回结果,则可以执行insert语句