PostgreSQL Return 行受到 UPDATE/INSERT 查询的影响

PostgreSQL Return affected rows by UPDATE/INSERT query

好的。所以我有这两个问题。两者做同样的事情:

1) 如果个人资料已存在,则仅使用新信息更新个人资料 2) 如果配置文件不存在则创建一个新的配置文件

限制: 1)用户名是唯一的(不能重复) 2) user_id 是唯一的(不能重复)

我正在尝试从服务器获取布尔响应,以便我的应用程序可以检查查询是否有效执行以及行是否受到影响。例如,如果用户想要更改其用户名,但他选择的用户名已被使用,则查询将不会执行,因此不会影响任何行。我需要某种 return(受影响的行数?)或 true/false 告诉我某行是否受到影响???

我是 postgreSQL 的新手,非常感谢任何形式的帮助。谢谢 =) 问候何塞·玛丽亚·兰达 =)

UPDATE people.profile SET profile_picture='test_profile_picture_url', alias='test_username' WHERE 

user_id='test_user_id'
AND NOT EXISTS (SELECT 1 FROM people.profile WHERE alias = 'test_username' AND user_id NOT LIKE 'test_user_id');

INSERT INTO people.profile (user_id, profile_picture, alias)
   SELECT 'test_user_id', 'test_profile_picture_url', 'test_username'
   WHERE NOT EXISTS (SELECT 1 FROM people.profile WHERE user_id = 'test_user_id' OR alias = 'test_username');

DO
$do$
BEGIN

IF EXISTS (SELECT 1 FROM people.profile WHERE user_id='test_user_id'
AND NOT EXISTS (SELECT 1 FROM people.profile WHERE alias = 'test_username' AND user_id NOT LIKE 'test_user_id')) 

THEN

-- UPDATE PROFILE INFO
UPDATE people.profile SET profile_picture='test_profile_picture_url', alias='test_username' WHERE 

user_id='test_user_id'
AND NOT EXISTS (SELECT 1 FROM people.profile WHERE alias = 'test_username' AND user_id NOT LIKE 'test_user_id');

ELSE 

-- CREATE NEW ACCOUNT
INSERT INTO people.profile (user_id, profile_picture, alias)
   SELECT 'test_user_id', 'test_profile_picture_url', 'test_username'
   WHERE NOT EXISTS (SELECT 1 FROM people.profile WHERE user_id = 'test_user_id' OR alias = 'test_username');

END IF;
END
$do$

我会创建一个函数并将其作为 return 文本或包含结果的枚举。这是一个例子:

CREATE OR REPLACE FUNCTION people.update_profile(USERID text,
    USER_NAME text, PHOTO_URL text)
  RETURNS text AS
$BODY$
DECLARE
  rec profile;
  matching_uid boolean;
  matching_name boolean;
  matching_both boolean;
  result text;
BEGIN

  for rec in select * from people.profile where user_id = USERID or USER_NAME = alias
  loop
    if rec.user_id = USERID and rec.alias = USER_NAME then matching_both = true;
    elsif rec.user_id = USERID then matching_uid = true;
    elsif rec.alias = USER_NAME then matching_name = true;
    end if;
  end loop;

  if matching_both then
    update people.profile
    set profile_picture = PHOTO_URL
    where user_id = USERID;

    result := 'Photo Updated';    
  elsif matching_name then
    result := 'Username is in use.  Please choose another';
  elsif matching_uid then
    update people.profile
    set profile_picture = PHOTO_URL, alias = USER_NAME
    where user_id = USERID;

    result := 'Photo and User Name Updated';
  else
    insert into people.profile
    (user_id, alias, profile_picture)
    values (USERID, USER_NAME, PHOTO_URL);

    result := 'New User Added';
  end if;

  return result;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

如果你这样调用函数:

select people.update_profile('hamb', 'Hambone', 'http://purple.com');

它会向您反馈更新是否成功,如果是则采取了哪些措施。

您绝对可以 return 行数,了解在 insert/update 之后受到类似影响的内容:

GET DIAGNOSTICS rowcount = ROW_COUNT;

但考虑到该函数只会 return 一个 1 或一个 0,我认为这些消息的文本或枚举会更有价值。