RE: Possible bug in referential integrity system
От | Piers Scannell |
---|---|
Тема | RE: Possible bug in referential integrity system |
Дата | |
Msg-id | F0DBB65C297FD211B06300A0C9DAFEE3290999@bert.internal.zone обсуждение исходный текст |
Ответ на | Possible bug in referential integrity system (Richard Ellis <rellis@erols.com>) |
Список | pgsql-bugs |
[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 > >
В списке pgsql-bugs по дате отправления: