Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何执行条件检查、返回错误或继续?_Postgresql - Fatal编程技术网

Postgresql 如何执行条件检查、返回错误或继续?

Postgresql 如何执行条件检查、返回错误或继续?,postgresql,Postgresql,用户想邀请朋友,但我想先检查一下。例如: SELECT friends_email from invites where friends_email = $1 limit 1; 如果找到了,那么我想返回一条消息,比如这位朋友已经被邀请了 如果没有找到,那么我想做一个插入 INSERT INTO invites etc... 但是我需要返回主用户的区域id SELECT region_id from users where user_id = $2 最好的方法是什么 谢谢 编辑-------

用户想邀请朋友,但我想先检查一下。例如:

SELECT friends_email from invites where friends_email = $1 limit 1;
如果找到了,那么我想返回一条消息,比如这位朋友已经被邀请了

如果没有找到,那么我想做一个插入

INSERT INTO invites etc...
但是我需要返回主用户的区域id

SELECT region_id from users where user_id = $2
最好的方法是什么

谢谢

编辑-------------------------------

下面是我在《plpgsql》中的结尾

IF EXISTS (SELECT * FROM invitations WHERE email = friends_email) THEN
  return 'Already Invited';
END IF;

INSERT INTO invitations (email) VALUES (friends_email);

return 'Invited';

我不知道可能有几十种更好的方法,但这对我来说很有效。

您可以创建SQL存储过程来实现上述功能

但从建筑学的角度来看,这是错误的。见:

DB的职责范围:存储数据


您必须将业务逻辑放入业务层。

而无需为您编写准确的代码片段

考虑通过调整数据以符合业务规则来解决此问题。如果您只能邀请某人一次,那么您应该有一个invites表,该表通过定义唯一invite的任何列的唯一规则来反映这一点。如果只是一个电子邮件地址,则将invests.email声明为唯一列

然后做一个插入。写下插入语,这样它就可以利用它来回答成功的问题。如果插入失败是因为您已经拥有该电子邮件地址—这是您想要执行的检查点,那么请在应用程序代码中捕获失败,并返回相应的响应

伪代码:

应用程序:

try
    invite.insert(NewGuy)
catch error.UniqueFail
    return "He's already been invited"
# ...do other stuff
博士后:

INSERT INTO invites
    (data fields + SELECT region thingy)
  VALUES
    (some arrangement of data that includes "region_id")
  RETURNING region_id
如果在第一次尝试时很难做到这一点,那么将insert目标语法化为CTE可能会有所帮助。如果所有其他操作都失败,请暂时按程序在plpgsql中编写它,确保外部接口接受正常的插入,这样以后就不必更改应用程序代码,并在知道性能是否存在问题后进行排序


这里的基本思想是让数据的关系形状尽可能避免任何过程性检查。这是关系数据建模的核心…现在有点像失传的艺术。

你知道当。。。然后其他的最后SQL@MladenUzelac如果插入不存在,这对插入有什么好处?似乎需要为此编写pl/pgsql函数或在应用程序中解决它。这是upsert问题的一种变体:。如果要使用错误陷阱执行此操作,请使用PL/PgSQL BEGIN。。。异常块。您的解决方案清楚地说明了您对该过程的意图,除非您面临性能问题,否则这是最好的结果。如果你以后确实遇到了性能问题,那么你可以探索其他方法,但当那一天到来时,当你重新阅读本文时,你的意图会非常清楚,很容易回忆起来。zxq9,谢谢你的帖子。当我处理不同的排列时,我不断地回到它。我从常规SQL开始,然后在“plpgsql”中结束,最后在原始文章中添加了一些非常简单的内容。虽然一开始我是在返回区域id,但最终我发现我并不需要它。但整个过程是一次很好的学习经历。再次感谢。@user390480听到这个消息太好了!我特别高兴你在这个过程中学到了很多。这是有史以来最好的结果。