Thread: NULL becomes default

NULL becomes default

From
"Julian Scarfe"
Date:
A surrogate key has been introduced on a table with modifiers:
  Column    |            Type             | 
Modifiers
-------------+-----------------------------+------------------------------------------------------------new_id    |
integer                    | not null default 
 
nextval(('some_id_seq'::text)::regclass)

However, some legacy software inserts into the table by first getting column 
names and then composing an INSERT for all the columns, filling in any 
undefined values with NULLs.

Thus when it attempts to insert a row I get a:

ERROR:  null value in column "new_id" violates not-null constraint

Thus I would like NULLs in such INSERTs to be treated as DEFAULT rather than 
violating the constraint.  Is there an easy way to do that at the database 
level?

Thanks

Julian




Re: NULL becomes default

From
Sumeet
Date:
Hi Julian u need to reset your sequence, i had run through the same problem.

On 8/17/06, Julian Scarfe <julian@avbrief.com > wrote:
A surrogate key has been introduced on a table with modifiers:

   Column    |            Type             |
Modifiers
-------------+-----------------------------+------------------------------------------------------------
new_id    | integer                     | not null default
nextval(('some_id_seq'::text)::regclass)

However, some legacy software inserts into the table by first getting column
names and then composing an INSERT for all the columns, filling in any
undefined values with NULLs.

Thus when it attempts to insert a row I get a:

ERROR:  null value in column "new_id" violates not-null constraint


To fix this, you need to do something like:

SELECT setval('public.fdata _fid_seq', max(fid)+1) FROM fdata; This will make sure that the next value your sequence generates is
greater than any key that already exists in the table.

>> taken from tom lane.

--
Thanks,
Sumeet.

Re: NULL becomes default

From
Markus Schaber
Date:
Hi, Julian,

Julian Scarfe wrote:
> A surrogate key has been introduced on a table with modifiers:
> 
>   Column    |            Type             | Modifiers
> -------------+-----------------------------+------------------------------------------------------------
> 
> new_id    | integer                     | not null default
> nextval(('some_id_seq'::text)::regclass)
> 
> However, some legacy software inserts into the table by first getting
> column names and then composing an INSERT for all the columns, filling
> in any undefined values with NULLs.
> 
> Thus when it attempts to insert a row I get a:
> 
> ERROR:  null value in column "new_id" violates not-null constraint
> 
> Thus I would like NULLs in such INSERTs to be treated as DEFAULT rather
> than violating the constraint.  Is there an easy way to do that at the
> database level?

Did you try a "before insert" trigger that checks new_id for null
values, and replaces it with nextval()?

Markus


-- 
Markus Schaber | Logical Tracking&Tracing International AG
Dipl. Inf.     | Software Development GIS

Fight against software patents in EU! www.ffii.org www.nosoftwarepatents.org


Re: NULL becomes default

From
"Julian Scarfe"
Date:
>> Thus I would like NULLs in such INSERTs to be treated as DEFAULT rather
>> than violating the constraint.  Is there an easy way to do that at the
>> database level?

From: "Markus Schaber" <schabi@logix-tt.com>

> Did you try a "before insert" trigger that checks new_id for null
> values, and replaces it with nextval()?

So thinking about this a little more, it requires me to be able to change a 
column value to DEFAULT (unless I implement the default from scratch in the 
trigger, but that feels messy).  I don't have much experience of triggers: 
can I do that?

Thanks

Julian 




Re: NULL becomes default

From
Andrew Sullivan
Date:
On Sun, Aug 20, 2006 at 11:34:48AM +0100, Julian Scarfe wrote:
> So thinking about this a little more, it requires me to be able to change a 
> column value to DEFAULT (unless I implement the default from scratch in the 
> trigger, but that feels messy).  I don't have much experience of triggers: 
> can I do that?

DEFAULT won't work for this case, I don't think; you want to set it
to the nextval() of the sequence or whatever it was you were trying
to do.  But it's not messy: this is precisely the sort of thing
BEFORE triggers are good at.

A

-- 
Andrew Sullivan  | ajs@crankycanuck.ca
"The year's penultimate month" is not in truth a good way of saying
November.    --H.W. Fowler