I changed the query to:

LOCK TABLE test IN EXCLUSIVE MODE;
WITH s AS (
   SELECT pid,area FROM test WHERE area = 'test123'
), i AS (
   INSERT INTO test (area)
   SELECT ' test123 '
   WHERE NOT EXISTS (SELECT 1 FROM s)
   RETURNING pid
)
UPDATE area
SET last_update = CURRENT_TIMESTAMP
WHERE pid =  (SELECT pid FROM s UNION SELECT pid FROM i) Or pid = (SELECT
pid FROM s Where area = ' test123')
RETURNING pid;

now it returns for both insert and update ..
but if I use BEGIN WORK; and COMMIT WORK; before and end of it .. it
returns empty


On Thu, May 16, 2019 at 9:47 PM Adrian Klaver <adrian.kla...@aklaver.com>
wrote:

> On 5/16/19 7:26 AM, Winanjaya Amijoyo wrote:
> > and yes .. I need both inserted pid and updated pid
>
> The INSERT pid is going to be 'swallowed' by the CTE that is why the:
>
> SELECT pid FROM s UNION SELECT pid FROM i
>
> Which also means the UPDATE RETURNING pid will be equal to it.
>
>
>
> >
> > On Thu, May 16, 2019 at 9:25 PM Winanjaya Amijoyo
> > <winanjaya.amij...@gmail.com <mailto:winanjaya.amij...@gmail.com>>
> wrote:
> >
> >     see enclosed screenshot..
> >
> >     I thought, the record still locked that's why it returns empty..
> >
> >     On Thu, May 16, 2019 at 9:21 PM Adrian Klaver
> >     <adrian.kla...@aklaver.com <mailto:adrian.kla...@aklaver.com>>
> wrote:
> >
> >         On 5/16/19 7:10 AM, Winanjaya Amijoyo wrote:
> >          > Hi David,
> >          >
> >          > thanks for your advise, as I am new with postgresql..
> >          > I try to use LOCK as below, but it does not returning pid?
> >          > what I missed?
> >
> >         I'm not sure which pid you are referring to, the INSERT or
> >         UPDATE or both?
> >
> >         Can you show the output of the query?
> >          >
> >          > BEGIN TRANSACTION;
> >          > LOCK TABLE test IN ACCESS EXCLUSIVE MODE;
> >          > WITH s AS (
> >          >     SELECT pid FROM test WHERE area = 'test4'
> >          > ), i AS (
> >          >     INSERT INTO test (area)
> >          >     SELECT 'test4'
> >          >     WHERE NOT EXISTS (SELECT 1 FROM s)
> >          >     RETURNING pid
> >          > )
> >          > UPDATE area
> >          > SET last_update = CURRENT_TIMESTAMP
> >          > WHERE pid = (SELECT pid FROM s UNION SELECT pid FROM i)
> >          > RETURNING pid;
> >          > COMMIT TRANSACTION;
> >          >
> >          >
> >
> >
> >         --
> >         Adrian Klaver
> >         adrian.kla...@aklaver.com <mailto:adrian.kla...@aklaver.com>
> >
>
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>

Reply via email to