agora inbox for pgsql-sql@postgresql.org
help / color / mirror / Atom feedFrom: daku.sandor@gmail.com
To: Shekar Tippur <ctippur@gmail.com>
Cc: pgsql-sql@postgresql.org <pgsql-sql@postgresql.org>
Subject: Re: Postgres CTE issues
Date: Wed, 27 May 2015 08:24:00 +0200
Message-ID: <355E8876-6CD0-4183-A969-674EC3848CEA@gmail.com> (raw)
In-Reply-To: <CAHmfAToeCWtdGcdtgPVJtXQxG1CWLwW1BKKoW=BT9zpR-p24TQ@mail.gmail.com>
References: <CAHmfATopobYPPVb5HRS-wZfuKkXLcz7gmbcx6bFpsKs1KE92-A@mail.gmail.com>
<CAKFQuwbMEZFiNKiaCKUvvoS854bkE3Dqa288vcGYTg3DtK09Og@mail.gmail.com>
<CAHmfATorjD9ieWk1U5ZAzSSrmpiCvWOdCtMof620JUQTmMugFA@mail.gmail.com>
<CAKFQuwaTZ8q0yBnEdkBjKtw4dzK9ntOSvVtSUxAa1fXMYNpsfg@mail.gmail.com>
<CAKFQuwb-H0SfLRwMCBAxfo4bwsB8X4MmKxgmqOqCNW7hpVWxHQ@mail.gmail.com>
<CAHmfAToeCWtdGcdtgPVJtXQxG1CWLwW1BKKoW=BT9zpR-p24TQ@mail.gmail.com>
List-Unsubscribe: <mailto:majordomo@postgresql.org?body=unsub%20pgsql-sql>
Hi,
Remove the the single quotes around NEW.var1 and you'll be golden.
Regards,
Sandor Daku
> On 26 May 2015, at 19:07, Shekar Tippur <ctippur@gmail.com> wrote:
>
> Here is a small snippet on how I got to the error. I am creating a trigger function that returns a trigger.
> As you can see, I get a error at the end. Appreciate any help in this regard.
>
> -- Create table A
>
> create table A (
>
> var1 varchar(40),
>
> var2 varchar(40) );
>
>
>
> -- Create table B
>
> create table B (
>
> "id" SERIAL PRIMARY KEY,
>
> name varchar(40));
>
>
> -- Create table C
>
> create table C (
>
> "id" SERIAL PRIMARY KEY,
>
> name varchar(40)
>
> , b_id integer references B(id) NOT NULL);
>
>
> -- Create a trigger function
>
> CREATE OR REPLACE FUNCTION fn_test() RETURNS trigger AS $BODY$
>
> DECLARE
>
> a_id int;
>
> b_id int;
>
> c_id int;
>
> BEGIN
>
> INSERT INTO B (name) VALUES (NEW.var1);
>
> b_id := (select id from B where name = 'NEW.var1');
>
> INSERT INTO C (name, b_id) VALUES (NEW.var2, b_id);
>
>
> return NEW;
>
> END;
>
> $BODY$ LANGUAGE plpgsql;
>
> -- Create trigger
>
> CREATE TRIGGER tr_test
>
> BEFORE insert or UPDATE
>
> ON A
>
> FOR EACH ROW
>
>
> EXECUTE PROCEDURE fn_test();
>
>
>
> insert into A (var1, var2) values ('Hello', 'World');
>
> ERROR: null value in column "b_id" violates not-null constraint
>
> DETAIL: Failing row contains (1, World, null).
>
> CONTEXT: SQL statement "INSERT INTO C (name, b_id) VALUES (NEW.var2, b_id)"
>
> PL/pgSQL function fn_test() line 17 at SQL statement
>
>
>> On Tue, May 26, 2015 at 9:14 AM, David G. Johnston <david.g.johnston@gmail.com> wrote:
>> re-including the list
>>
>>> On Tue, May 26, 2015 at 9:09 AM, Shekar Tippur <ctippur@gmail.com> wrote:
>>
>>>
>>>> On Tue, May 26, 2015 at 9:00 AM, David G. Johnston <david.g.johnston@gmail.com> wrote:
>>>>> On Tue, May 26, 2015 at 8:45 AM, Shekar Tippur <ctippur@gmail.com> wrote:
>>>>
>>>>>
>>>>> This is what I am trying:
>>>>>
>>>>> WITH x AS
>>>>>
>>>>> (INSERT INTO industry (name,abbr,description,cr_date,last_upd)
>>>>>
>>>>> VALUES ('df','','',now(),now()) returning id) insert into sector (name,description,cr_date,last_upd,industry_id) select 's1','',now(),now(),id from x;
>>>>>
>>>>> I get a error:
>>>>>
>>>>> ERROR: insert or update on table "sector" violates foreign key constraint "sector_id_fkey"
>>>>>
>>>>> DETAIL: Key (id)=(394) is not present in table "industry".
>>>>>
>>>>> If I execute the insert individually, I am able to insert a record. Wonder what I am doing wrong.
>>>>>
>>>>> I have been stuck with this issue for over 24 hours. Appreciate any help.
>>>>
>>>> It is not possible to accomplish your goal using a CTE. From the point of view of both tables the data they can see is what was present before the statement began.
>>>>
>>>> The more usual way to accomplish this is the write a pl/pgsql function with two statements and passing the ID between them using an intermediate variable.
>>>>
>>>> David J.
>> >>>>>>>>>>>>>>>>>>>
>> I have tried that as well.
>>
>> INSERT INTO industry (name,abbr,description,cr_date,last_upd) VALUES (NEW.industry,'','',now(),now()) returning id into industry_id;
>>
>> industry_id := (select industry_id from industry where name = 'NEW.industry');
>>
>> raise notice 'industry id is %', industry_id;
>>
>> INSERT INTO sector (name,description,cr_date,last_upd,industry_id) VALUES (NEW.sector,'',now(),now(),industry_id) returning id into sector_id;
>>
>> -- I get a new industry ID but a new row is not inserted. I am guessing this is the case because it takes all the transactions as atomic. As a result, I get a foreign key violation.
>>
>>
>> >>>>>>>>>>>>>>>>>>
>>
>> If you are using a trigger you should also provide the relevant CREATE TRIGGER statement...
>>
>> In fact, you really you supply a self-contained example.
>>
>> Also, please do not top-post.
>>
>> David J.
>
view thread (9+ messages)
Message-ID: <355E8876-6CD0-4183-A969-674EC3848CEA@gmail.com>
Permalink: ../355E8876-6CD0-4183-A969-674EC3848CEA@gmail.com/
Also on: postgresql.org/message-id/355E8876-6CD0-4183-A969-674EC3848CEA@gmail.com
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-sql@postgresql.org
Cc: daku.sandor@gmail.com, ctippur@gmail.com
Subject: Re: Postgres CTE issues
In-Reply-To: <355E8876-6CD0-4183-A969-674EC3848CEA@gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox