Обсуждение: NULL becomes default

Поиск
Список
Период
Сортировка

NULL becomes default

От
"Julian Scarfe"
Дата:
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

От
Sumeet
Дата:
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

От
Markus Schaber
Дата:
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

От
"Julian Scarfe"
Дата:
>> 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

От
Andrew Sullivan
Дата:
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