当前位置: 首页 > 知识库问答 >
问题:

如果不存在,如何插入行,否则在MariaDB中选择并返回其ID?

沈冠宇
2023-03-14

我有一个带有< code>ID主键(自动增量)和唯一列< code>Name的表。如果相同的< code>Name不存在,在MariaDB中有没有一种有效的方法将一行插入到这个表中,否则选择现有的行,并且在这两种情况下,返回具有这个< code>Name的行的ID?

这是Postgres的解决方案。然而,MariaDB似乎没有RETURNING id子句。到目前为止,我尝试的是暴力:

INSERT IGNORE INTO services (Name) VALUES ('JohnDoe');
SELECT ID FROM services WHERE Name='JohnDoe';

更新:MariaDB 10.5有RETURNING子句,但是,我目前尝试的查询抛出语法错误:

WITH i AS (INSERT IGNORE INTO services (`Name`) VALUES ('John') RETURNING ID)
SELECT ID FROM i
UNION
SELECT ID FROM services WHERE `Name`='John'

共有1个答案

牟飞沉
2023-03-14

对于单行,假设< code>id是< code>AUTO_INCREMENT。

INSERT INTO t (name)
    VALUES ('JohnDoe')
    ON DUPLICATE KEY id = LAST_INSERT_ID(id);
SELECT LAST_INSERT_ID();

这看起来很笨拙,但它是文档中的一个例子。

警告: 大多数形式的 INSERT 都会“刻录”auto_inc ID。也就是说,他们在意识到该 id 不会被使用之前获取下一个 ID。这可能会导致最大auto_inc尺寸溢出。

同样明智的是,不要将规范化放在处理代码“肉”的事务中。它不必要地长时间占用表,并且在回滚的情况下有燃烧id的额外风险。

对于像这样的“规范化”表的批量更新,请参阅我的注释:http://mysql.rjweb.org/doc.php/staging_table#normalization(它避免了刻录id。

 类似资料:
  • 问题内容: 在一个SQL语句中,我尝试插入一行,如果由于约束而失败,则返回现有行。 我有: 该列具有唯一约束。我尝试在末尾追加,但这仍然不返回现有行。 为什么是这样?我以为我的最后一条语句将被执行并返回。有任何想法吗? 注意:由于某些复杂的竞争条件,我无法使用Postgres函数或多个SQL语句。 问题答案: WITH d(t, e) AS ( VALUES (‘abcdefg’, ‘2014-0

  • 问题内容: 我在node.js中编写一个函数来查询PostgreSQL表。 如果该行存在,我想从该行返回id列。 如果不存在,我想将其插入并返回ID()。 我一直在尝试和语句的变体,但似乎无法使其正常工作。 问题答案: 我建议在数据库端进行检查,然后将ID返回给nodejs。 例子: 而不是在Node.js端(在此示例中,我使用的是node-postgres):

  • 问题内容: 我从谷歌搜索开始,发现这篇文章讨论了互斥表。 我有一张约有1400万条记录的表。如果我想以相同的格式添加更多数据,是否有一种方法可以确保我要插入的记录在不使用一对查询的情况下就不存在(即,要检查的一个查询和要插入的一个查询是结果集是空的)? 字段上的约束是否可以确保如果该约束已经存在,该约束将失败? 似乎 只有 一个约束条件,当我通过php发出插入命令时,脚本就发出了嘎嘎叫声。 问题答

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用

  • 我现在正在寻找一段时间没有找到解决我的问题的方法。如果当前不存在,我想在表中插入一个新行。我需要该新条目的自动递增键或现有条目的现有键。 此外,我不清楚INSERT的返回值是什么,如果插入一列,值=1,如果行存在该怎么办?值=0或NULL或?! 如果可能的话,我不想“批量插入”,我必须在下一次插入时使用这两个返回值作为外键……或者有人知道如何使用批量插入来完成这一切吗? 感谢所有能帮忙的人!! 系

  • 问题内容: 我在使用SQL查询时遇到问题。如果同一行尚不存在,我需要插入一行。这是我到目前为止的内容: 我对sql不太熟悉,尤其是不存在的语法,因此在执行时会出现以下错误: ORA-06550:第37行,第11列:PLS-00103:在预期以下情况之一时遇到了符号“ INSERT”: 然后和或 用“ then”符号代替“ INSERT”继续。 following: the following: 问