MySQL过程 - 如果不存在则插入行

时间:2014-01-25 15:13:03

标签: mysql sql

好的,这就是我想要做的事情:

  • 如果条目已存在(例如,基于字段name),则只返回其id
  • 如果没有,请添加

这是我迄今为止所管理的内容(对于“if not exists,create it”部分):

INSERT INTO `objects` (`id`,`name`)
    SELECT NULL,'someObj2' FROM `objects`
        WHERE NOT EXISTS
             (SELECT name FROM `objects` WHERE `name`='someObj2');
SELECT LAST_INSERT_ID();

如果条目 存在,如何获得id(而不是LAST_INSERT_ID())?


P.S。是的,我知道我无法理解SQL的主要原因是我已经习惯了常规编程语言的更经典的if-then-else方法... lol


更新:

我一直在尝试和尝试这个我迄今为止管理的内容(作为存储过程):

IF EXISTS (SELECT * FROM `objects` WHERE `name` = NAME) 
THEN
    SELECT `id` FROM `objects` WHERE `name` = NAME;
ELSE
    INSERT INTO `objects` (`id`,`name`) VALUES(NULL,NAME);
    SELECT LAST_INSERT_ID() AS 'id';
END IF

并将其称为:CALL insertObject("someObj2");

但是,它没有按预期工作 - 它既没有添加条目,也没有返回id(而是返回表中的所有 id ...)。知道会出现什么问题吗?

1 个答案:

答案 0 :(得分:2)

您似乎试图在unique上强制实施name约束。如果是这样,您也可以通过将列声明为unique或等效创建唯一索引来执行此操作:

create unique index objects_name on objects(name);

如果是这样,那么请将问题从上次插入的id更改为仅id获取name

select id
from objects o
where o.name = 'someObj2';

我赶紧在快速添加和删除内容的高事务环境中添加它,任何方法都可能有问题。考虑一下您的代码,即使在last_insert_id()执行之前,也可以插入然后删除该行。如果您正在处理具有潜在竞争条件的高事务环境,那么您需要使用事务和锁定来执行您想要的操作。

相关问题