好的,这就是我想要做的事情:
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
...)。知道会出现什么问题吗?
答案 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()
执行之前,也可以插入然后删除该行。如果您正在处理具有潜在竞争条件的高事务环境,那么您需要使用事务和锁定来执行您想要的操作。