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