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

问题描述:

OK。所以我有这2个查询。都做同样的事情: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,我觉得无论是文字或列举这些消息将更有价值。

+0

谢谢你!!!那没有把戏好!为什么我以前没有想过?你真的帮助我。再次感谢!!! –