sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-11-29 08:12:12 27 4
mua khóa gpt4 Nike

好的,这就是我想做的:

  • 如果条目已存在(例如基于字段tên),则只需返回其nhận dạng
  • 如果没有,请添加

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

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

如果条目Thực ra存在,我如何获取nhận dạng(còn hơn làLAST_INSERT_ID())?

<小时>

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

<小时>

làm mới:

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

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(而是返回表中的tất cả nhận dạng。 .)。知道可能出了什么问题吗?

1 Câu trả lời

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

create unique index objects_name on objects(name);

如果这是真的,则将问题从获取最后插入的 nhận dạng 更改为仅获取 tên của nhận dạng:

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

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

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

27 4 0
Bài viết được đề xuất: rust - 我怎样才能得到 clap 来包装长的帮助信息?
Bài viết được đề xuất: mysql - SQL 使用 COUNT() 和 LEFT JOIN 合并两个或三个表
Bài viết được đề xuất: mysql - 查询加载时间过长
Bài viết được đề xuất: java - JAVA中SQL语句的where子句中使用变量
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com