gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:12:12 27 4
gpt4 key购买 nike

好的,这就是我想做的:

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

这是我迄今为止所管理的(对于“如果不存在,则创建它”部分):

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())?

<小时/>

附注是的,我知道我无法理解 SQL 的主要原因是我对常规编程语言的更经典的 if-then-else 方法的习惯程度......哈哈

<小时/>

更新:

我不断尝试,这是我迄今为止所管理的(作为存储过程):

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。 .)。知道可能出了什么问题吗?

最佳答案

您似乎正在尝试对 name 强制执行 unique 约束。如果是这样,您还可以通过将列声明为唯一或等效地创建唯一索引来实现此目的:

create unique index objects_name on objects(name);

如果这是真的,则将问题从获取最后插入的 id 更改为仅获取 nameid:

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

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

关于MySQL 过程 - 如果不存在则插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352278/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com