如果行不存在,如何插入行,否则在mariadb中选择并返回它的id?

c0vxltue  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(521)

我有一张table ID 主键(自动递增)和唯一列 Name . 在mariadb中有没有一种有效的方法可以在相同的情况下将行插入到这个表中 Name 不存在,否则选择现有行,在这两种情况下,都返回带有此 Name ?
这里有一个解决方案。然而,马里亚德似乎没有 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'
thtygnil

thtygnil1#

对于一行,假设 idAUTO_INCREMENT .

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

这看起来很模糊,但这是文档中的一个例子。
注意:大多数形式的 INSERT 会“烧掉”汽车公司的身份证。也就是说,他们在意识到下一个id将不会被使用之前获取下一个id。这可能会导致最大汽车尺寸溢出。
同样明智的做法是,不要将规范化放在处理代码“肉”的事务中。它不必要地占用了表太长的时间,并且在回滚的情况下有烧毁id的额外风险。
要批量更新这样的“规范化”表,请参见此处的注解:http://mysql.rjweb.org/doc.php/staging_table#normalization (它可以避免烧毁ID。)

相关问题