PostgreSQL通过UPDATE / INSERT查询返回受影响的行

何塞·玛丽亚·兰达

好的。所以我有这两个查询。两者都做同样的事情:

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

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

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

我是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$
火腿骨

我将创建一个函数,并使其返回文本或结果枚举。这是一个例子:

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');

它会告诉您是否已成功更新该消息,以及是否已采取了什么措施。

您肯定可以在插入/更新后返回行计数,该行计数受以下影响:

GET DIAGNOSTICS rowcount = ROW_COUNT;

但是鉴于该函数只会返回1或0,我认为这些消息的文本或枚举将更有价值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Sequlize.js:.update 不返回受影响的行

来自分类Dev

PostgreSQL函数返回受影响的行数

来自分类Dev

SQL UPDATE CASE 返回(0 行受影响),它不应该

来自分类Dev

C#ADO.NET UPDATE不会更改数据库记录,但仍会返回1个受影响的行

来自分类Dev

PHP / MySQL:查询正确执行,受影响的行返回-1

来自分类Dev

SQL Update是否不保存受影响的行?

来自分类Dev

具有LIKE => 0行的SQL UPDATE受影响

来自分类Dev

MySQL INSERT显示受影响的行多于受影响的行

来自分类Dev

UPDATE查询成功,但影响PostgreSQL中的0行

来自分类Dev

带有FOR EACH ROW的postgresql触发器影响不受影响的行

来自分类Dev

BULK INSERT 0 行受影响

来自分类Dev

SQLite3-返回受影响的行

来自分类Dev

MySQL 更新返回 0 行受影响

来自分类Dev

为什么SELECT和UPDATE返回不同的记录计数/受影响

来自分类Dev

当前值和新值相同时,更新查询将受影响的行返回为0

来自分类Dev

如何找出MySQL程序中的UPDATE语句后受影响的行?

来自分类Dev

如何使用嵌套 SELECT 获取 INSERT 查询的插入行数?没有受影响的行,结果 ID,数量行

来自分类Dev

PostgreSQL查询更新返回UPDATE 0

来自分类Dev

PostgreSQL查询更新返回UPDATE 0

来自分类Dev

从PostgreSQL中的UPDATE查询返回多个值

来自分类Dev

CDbCommand :: createCommand()在迁移内返回零受影响的行

来自分类Dev

插入行时Codeigniter受影响的行总是返回0

来自分类Dev

java preparestatement executeUpdate返回错误的受影响行

来自分类Dev

无法使用SQLSRV返回批量插入中受影响的行

来自分类Dev

如果受影响的行返回DB类的非对象错误

来自分类Dev

通过T-SQL检索受影响的记录

来自分类Dev

通过T-SQL检索受影响的记录

来自分类Dev

PostgreSQL通过子查询循环

来自分类Dev

通过参数 postgresql 返回列名

Related 相关文章

  1. 1

    Sequlize.js:.update 不返回受影响的行

  2. 2

    PostgreSQL函数返回受影响的行数

  3. 3

    SQL UPDATE CASE 返回(0 行受影响),它不应该

  4. 4

    C#ADO.NET UPDATE不会更改数据库记录,但仍会返回1个受影响的行

  5. 5

    PHP / MySQL:查询正确执行,受影响的行返回-1

  6. 6

    SQL Update是否不保存受影响的行?

  7. 7

    具有LIKE => 0行的SQL UPDATE受影响

  8. 8

    MySQL INSERT显示受影响的行多于受影响的行

  9. 9

    UPDATE查询成功,但影响PostgreSQL中的0行

  10. 10

    带有FOR EACH ROW的postgresql触发器影响不受影响的行

  11. 11

    BULK INSERT 0 行受影响

  12. 12

    SQLite3-返回受影响的行

  13. 13

    MySQL 更新返回 0 行受影响

  14. 14

    为什么SELECT和UPDATE返回不同的记录计数/受影响

  15. 15

    当前值和新值相同时,更新查询将受影响的行返回为0

  16. 16

    如何找出MySQL程序中的UPDATE语句后受影响的行?

  17. 17

    如何使用嵌套 SELECT 获取 INSERT 查询的插入行数?没有受影响的行,结果 ID,数量行

  18. 18

    PostgreSQL查询更新返回UPDATE 0

  19. 19

    PostgreSQL查询更新返回UPDATE 0

  20. 20

    从PostgreSQL中的UPDATE查询返回多个值

  21. 21

    CDbCommand :: createCommand()在迁移内返回零受影响的行

  22. 22

    插入行时Codeigniter受影响的行总是返回0

  23. 23

    java preparestatement executeUpdate返回错误的受影响行

  24. 24

    无法使用SQLSRV返回批量插入中受影响的行

  25. 25

    如果受影响的行返回DB类的非对象错误

  26. 26

    通过T-SQL检索受影响的记录

  27. 27

    通过T-SQL检索受影响的记录

  28. 28

    PostgreSQL通过子查询循环

  29. 29

    通过参数 postgresql 返回列名

热门标签

归档