Re: [GENERAL] Missing feature - how to differentiate insert/update inplpgsql function? - Mailing list pgsql-general

From Adrian Klaver
Subject Re: [GENERAL] Missing feature - how to differentiate insert/update inplpgsql function?
Date
Msg-id 79cc7df0-ad7e-d9fe-f2e9-19c3a4e3f482@aklaver.com
Whole thread Raw
In response to Re: [GENERAL] Missing feature - how to differentiate insert/updatein plpgsql function?  (hubert depesz lubaczewski <depesz@depesz.com>)
List pgsql-general
On 02/15/2017 06:53 AM, hubert depesz lubaczewski wrote:
> On Wed, Feb 15, 2017 at 06:44:09AM -0800, Adrian Klaver wrote:
>> On 02/15/2017 06:27 AM, hubert depesz lubaczewski wrote:
>>> On Wed, Feb 15, 2017 at 06:24:14AM -0800, Adrian Klaver wrote:
>>>> On 02/15/2017 06:05 AM, hubert depesz lubaczewski wrote:
>>>>> Hi,
>>>>> I have a function, in PostgreSQL 9.6, which does:
>>>>>
>>>>> INSERT INTO table () values (...)
>>>>> ON CONFLICT DO UPDATE ...;
>>>>>
>>>>> The thing is that the function should return information whether the row
>>>>> was modified, or created - and currently it seems that this is not
>>>>> available. Or am I missing something?
>>>>
>>>> All I can think of is to use:
>>>>
>>>> RETURNING pk
>>>>
>>>> and see if that changed or not.
>>>
>>> Well, this wouldn't work for me as pkey will not change.
>>
>> Alright you lost me. If the pkey does not change then how do you get new
>> rows(INSERT)?
>>
>>>
>>> For my particular case, I have this table
>>> create table t (
>>>    a_from text,
>>>    a_to text,
>>>    created timestamptz,
>>>    updated timestamptz,
>>>    primary key (a_from, a_to)
>>> );
>
> Well, if I do:
>
> insert into t (a_from, a_+to)
>
> and will use some values that do not exist in table, then insert
> happens, but not sure what do you mean about "primary key change" in
> this case.
>
> On the other hand, if the from/to already exists in the table, then
> update happens (on "updated" column) - and then there is definitely no
> pkey change.

Yeah I see(thanks to Karsten also). So:

CREATE TABLE upsert_test (fld_1 varchar,
     fld_2 varchar,
     PRIMARY KEY (fld_1,-
         fld_2));

INSERT INTO upsert_test (fld_1,
     fld_2)
VALUES ('test1', 'test3')
     ON CONFLICT (fld_1,
         fld_2)
     DO
UPDATE
SET fld_1 = EXCLUDED.fld_1,
     fld_2 = EXCLUDED.fld_2
RETURNING
     fld_1,
     fld_2;

  fld_1 | fld_2
-------+-------
  test1 | test3
(1 row)

INSERT 0 1

INSERT INTO upsert_test (fld_1,
     fld_2)
VALUES ('test4', 'test5')
     ON CONFLICT (fld_1,
         fld_2)
     DO
UPDATE
SET fld_1 = EXCLUDED.fld_1,
     fld_2 = EXCLUDED.fld_2
RETURNING
     fld_1,
     fld_2;

  fld_1 | fld_2
-------+-------
  test4 | test5


Can see the differentiation issue now. Can't see a solution right now
other then the one you already have, a marker field that you can use to
determine INSERT/UPDATE.


>
> Best regards,
>
> depesz
>
>


--
Adrian Klaver
adrian.klaver@aklaver.com


pgsql-general by date:

Previous
From: hubert depesz lubaczewski
Date:
Subject: Re: [GENERAL] Missing feature - how to differentiate insert/updatein plpgsql function?
Next
From: pinker
Date:
Subject: [GENERAL] Using ctid in delete statement