Обсуждение: Serial and NULL values
I just received a message from someone complaining about SERIAL/sequence. I think there is a problem:test=> create table test (x int, y serial);NOTICE: CREATE TABLE will create implicit sequence 'test_y_seq'for SERIAL column 'test.y'NOTICE: CREATE TABLE/UNIQUE will create implicit index 'test_y_key' for table 'test'CREATEtest=>insert into test (x) values (100);INSERT 19359 1test=> insert into test (x) values (100);INSERT 19360 1 These work fine, but why does this fail: test=> insert into test values (100, null);ERROR: ExecAppend: Fail to add null value in not null attribute ytest=> insertinto test values (100, 0);INSERT 19363 1test=> insert into test values (100, 0);ERROR: Cannot insert a duplicatekey into a unique index Can't they use zero or null, and have the sequence value be computed? Is there some design decision we made to prevent this? -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
Bruce Momjian <maillist@candle.pha.pa.us> writes:
> test=> create table test (x int, y serial);
> CREATE
> test=> insert into test values (100, null);
> ERROR: ExecAppend: Fail to add null value in not null attribute y
gram.y thinks SERIAL is defined to mean NOT NULL:
| ColId SERIAL ColPrimaryKey { ColumnDef *n = makeNode(ColumnDef);
n->colname = $1; n->typename = makeNode(TypeName); n->typename->name =
xlateSqlType("integer"); n->raw_default = NULL; n->cooked_default = NULL;
=================> n->is_not_null = TRUE; n->is_sequence = TRUE; n->constraints =
$3;
$$ = (Node *)n; }
Offhand I don't see any fundamental reason why serial columns should
be restricted to be nonnull, but evidently someone did at some point.
regards, tom lane
> Bruce Momjian <maillist@candle.pha.pa.us> writes:
> > test=> create table test (x int, y serial);
> > CREATE
> > test=> insert into test values (100, null);
> > ERROR: ExecAppend: Fail to add null value in not null attribute y
>
> gram.y thinks SERIAL is defined to mean NOT NULL:
>
> | ColId SERIAL ColPrimaryKey
> {
> ColumnDef *n = makeNode(ColumnDef);
> n->colname = $1;
> n->typename = makeNode(TypeName);
> n->typename->name = xlateSqlType("integer");
> n->raw_default = NULL;
> n->cooked_default = NULL;
> =================> n->is_not_null = TRUE;
> n->is_sequence = TRUE;
> n->constraints = $3;
>
> $$ = (Node *)n;
> }
>
> Offhand I don't see any fundamental reason why serial columns should
> be restricted to be nonnull, but evidently someone did at some point.
The actual null is not the issue. The issue is that if we have a
SERIAL column, and we try to put a NULL in there, shouldn't it put the
default sequence number in there?
-- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610)
853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill,
Pennsylvania19026
On Fri, Oct 29, 1999 at 08:20:30PM -0400, Bruce Momjian wrote:
> >
> > Offhand I don't see any fundamental reason why serial columns should
> > be restricted to be nonnull, but evidently someone did at some point.
>
> The actual null is not the issue. The issue is that if we have a
> SERIAL column, and we try to put a NULL in there, shouldn't it put the
> default sequence number in there?
>
It seems logical that if a value was supplied for a serial column that
it would override the default. After all, SERIAL is just an int column
with a default based on a sequence, right?. If the default is always
used (even when a value is supplied) then that would be a REAL BIG problem.
Without making SERIAL a distinctly different datatype, I can't see how
a default sequence could behave differently for two tables created with
different syntax.
My 2 cents is that the current behavior is the correct behavior.
As far as the NULL goes, since the SERIAL column is assumed to be a
key and a unique index is created, having it NOT NULL seems like a
good idea. I don't know anyone who would have a key value be NULL,
and even if it could be NULL, you would olny be allowd one NULL.
--
The world's most ambitious and comprehensive PC game database project.
http://www.mobygames.com
Bruce Momjian <maillist@candle.pha.pa.us> writes:
>> Offhand I don't see any fundamental reason why serial columns should
>> be restricted to be nonnull, but evidently someone did at some point.
> The actual null is not the issue. The issue is that if we have a
> SERIAL column, and we try to put a NULL in there, shouldn't it put the
> default sequence number in there?
No, I wouldn't expect that at all. A default is inserted when you
don't supply anything at all for the column. Inserting an explicit
NULL means you want a NULL, and barring a NOT NULL constraint on
the column, that's what the system ought to insert. I can see no
possible justification for creating a type-specific exception to
that behavior.
If the original asker really wants to substitute something else for
an explicit null insertion, he could do it with a rule or a trigger.
But I don't think SERIAL ought to act that way all by itself.
regards, tom lane
>
> Bruce Momjian <maillist@candle.pha.pa.us> writes:
> >> Offhand I don't see any fundamental reason why serial columns should
> >> be restricted to be nonnull, but evidently someone did at some point.
>
> > The actual null is not the issue. The issue is that if we have a
> > SERIAL column, and we try to put a NULL in there, shouldn't it put the
> > default sequence number in there?
>
> No, I wouldn't expect that at all. A default is inserted when you
> don't supply anything at all for the column. Inserting an explicit
> NULL means you want a NULL, and barring a NOT NULL constraint on
> the column, that's what the system ought to insert. I can see no
> possible justification for creating a type-specific exception to
> that behavior.
>
> If the original asker really wants to substitute something else for
> an explicit null insertion, he could do it with a rule or a trigger.
> But I don't think SERIAL ought to act that way all by itself.
>
> regards, tom lane
I agree with tom.
If you don't want the user to be able to insert NULL, specify
NOT NULL explicitly. And if you want to force a default
behaviour, use a trigger (a rule can't do - sorry).
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #
> Bruce Momjian <maillist@candle.pha.pa.us> writes: > >> Offhand I don't see any fundamental reason why serial columns should > >> be restricted to be nonnull, but evidently someone did at some point. > > > The actual null is not the issue. The issue is that if we have a > > SERIAL column, and we try to put a NULL in there, shouldn't it put the > > default sequence number in there? > > No, I wouldn't expect that at all. A default is inserted when you > don't supply anything at all for the column. Inserting an explicit > NULL means you want a NULL, and barring a NOT NULL constraint on > the column, that's what the system ought to insert. I can see no > possible justification for creating a type-specific exception to > that behavior. > > If the original asker really wants to substitute something else for > an explicit null insertion, he could do it with a rule or a trigger. > But I don't think SERIAL ought to act that way all by itself. OK, I see now. In Informix, if you insert 0 into a serial column, you get the nextval assigned. However, I can see that is not logical. We have serial which defines a default for nextval(). Thanks. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026
> > No, I wouldn't expect that at all. A default is inserted when you > > don't supply anything at all for the column. Inserting an explicit > > NULL means you want a NULL, and barring a NOT NULL constraint on > > the column, that's what the system ought to insert. I can see no > > possible justification for creating a type-specific exception to > > that behavior. > > > > If the original asker really wants to substitute something else for > > an explicit null insertion, he could do it with a rule or a trigger. > > But I don't think SERIAL ought to act that way all by itself. > > > > regards, tom lane > > I agree with tom. > > If you don't want the user to be able to insert NULL, specify > NOT NULL explicitly. And if you want to force a default > behaviour, use a trigger (a rule can't do - sorry). I thought Informix put the nextval with NULL, but I now see they do it with zero, which is pretty strange. Never mind. -- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610) 853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania19026