Thread

  1. RE: Possible bug in referential integrity system

    Piers Scannell <piers.scannell@globecastne.com> — 2000-09-06T15:21:54Z

    [copied to list]
    
    My understanding, which isn't based on my experience more than reading any
    standards, is that a referential foriegn key field in a table can be either,
    a value from the referenced table, or null.
    
    Null kinda implies "n/a". 
    
    So order-lines on an order might reference a stock item from the stock
    table.
    But you might enter an order-line where the stock item was null, meaning not
    from the stock table.
    _Not_ meaning that there is a stock item with code "null".
    
    Remember that in general:
     null != null
    
    In joins, these rows don't normally appear, so it's worth watching. I'm not
    a posgresql expert (or an oracle one!) but in oracle you can use a syntax "
    select a, b from t1, t2 where t1.id = t2.id (+) " which also includes rows
    where the foreign key is null (setting all columns from the other table to
    null in those rows).
    
    
    > -----Original Message-----
    > From:	Richard Ellis [SMTP:rellis@erols.com]
    > Sent:	Wednesday, September 06, 2000 1:00 PM
    > To:	piers.scannell@globecastne.com
    > Subject:	Re: [BUGS] Possible bug in referential integrity system
    > 
    > > 	create table t1 (num int4, name text);
    > > 	create table t2 (ref int4 references t1 (num), val text);
    > > 	insert into t1 values (1, 'Widget1');
    > > 	insert into t2 values ( (select num from t1 where name = 'Widget1'),
    > > 'Valuable');
    > > 	insert into t2 values ( (select num from t1 where name = 'widget2'),
    > > 'Bug?');
    > > 
    > > In the second case, the ref column in t2 isn't "not null" so it can
    > > be a null. Foreign keys can be null, that is allowed, unless you
    > > specify "not null". So the second insert's select gives null and
    > > that's inserted into t2 correctly.
    > 
    > Ok, then, is this my minunderstanding of how SQL works.  Here's what
    > I thought things meant.
    > 
    > t2 has a foreign key reference to t1.  Therefore, to insert a value
    > into t2, a corresponding value must be present in t1.
    > 
    > t1 has only one row, and that row has a value in the referenced
    > foreign key constraint.
    > 
    > Insertion of a null into the foreign key constraint column of t2
    > should check t1 to see if at least one row has a null value.
    > 
    > In this case, no row of t1 contains null.
    > 
    > Therefore, the insert should fail, because there is no corresponding
    > value in t1?
    > 
    > Or am I unaware of a subtle side effect of 'null" when used in a
    > foreign key constraint, in that 'null' in actuality means "do not
    > check the foreign key constraint, just insert the remaining values"? 
    > If this is the meaning of 'null', is it documented anywhere?
    > 
    > Thanks
    > 
    >