检查记录是不是存在,如果它确实加 1(在过程中)

Posted

技术标签:

【中文标题】检查记录是不是存在,如果它确实加 1(在过程中)【英文标题】:Check if record exists, if it does add 1 (inside procedure)检查记录是否存在,如果它确实加 1(在过程中) 【发布时间】:2015-05-09 17:47:20 【问题描述】:

我正在尝试检查电子邮件地址是否已经存在,如果存在则添加 1(如果即使存在电子邮件+1 则添加 1,依此类推)。但到目前为止,我什至无法弄清楚如何在一个过程中检查它是否存在。

if exists (select 1 from table where email='something') then ...

返回错误(“函数或伪列 'EXISTS' 只能在 SQL 语句中使用)”。也尝试了其他东西,但那些可能不值得一提。

完成此操作后,我计划创建一个 while 循环,以便根据需要添加 1。

【问题讨论】:

我可能不是很具体,只是在邮件末尾加1,例如bunny -> bunny1。 【参考方案1】:

您可以将匹配记录的数量选择到一个变量(您已声明)中,然后检查该变量的值:

select count(*) into l_count
from my_table
where email = 'something';
if l_count > 0 then
  -- record exists
  ...
else
  -- record does not exist
  ...
end if;

这有望涵盖您关于检查存在的具体问题。至于您的基本目标,听起来您正试图通过增加后缀来找到未使用的值。如果是这样,this similar question 可能会有所帮助。那是找用户名而不是邮箱,但原理是一样的。

正如 cmets 中所指出的,同时调用您的过程可能仍会尝试使用相同的后缀值;所以你仍然需要一个唯一的约束,并处理在那种情况下被违反的约束。不过,我认为这超出了您在这里所问的范围。

【讨论】:

@Saeq - 很高兴它有帮助;检查我的编辑,看看链接的问题是否有助于您的总体目标。 可以通过添加rownum = 1条件进行一点优化。 是的,虽然我认为在这种情况下不会出现重复;我只是在最后一分钟将= 1 更改为> 0,以防万一 *8-) 鉴于 OP 在对他的问题的评论中解释的用例,如果您有两个并发插入同一封电子邮件,它的行为如何?我们不能最终插入两次带有 same 后缀的电子邮件吗? 也是正确的,但就像我说的那样,我正在解决特定的存在问题。整个过程仍然需要对同时调用的违反进行独特的检查和处理。

以上是关于检查记录是不是存在,如果它确实加 1(在过程中)的主要内容,如果未能解决你的问题,请参考以下文章

插入查询检查记录是不是存在 - 如果不存在,插入它[重复]

如何检查 Android SQLite 数据库中是不是存在表?

MySQL,使用SQL检查表中是不是存在列

检查文件是不是存在然后追加记录

检查 Laravel 中是不是存在记录不起作用

如何检查刀片中是不是存在记录?