Re: Column defaults fail with rules on view

Поиск
Список
Период
Сортировка
От Richard Huxton
Тема Re: Column defaults fail with rules on view
Дата
Msg-id 200309191411.16282.dev@archonet.com
обсуждение исходный текст
Ответ на Re: Column defaults fail with rules on view  (<btober@seaworthysys.com>)
Список pgsql-general
On Friday 19 September 2003 13:36, btober@seaworthysys.com wrote:
> > On Friday 19 September 2003 09:00, btober@seaworthysys.com wrote:
> >> I'm finding that column defaults are not being assigned to nulls when
> >> I do an insert by way of a an ON INSERT rule on a view. For example,
> >> the following script
> >
> > [snip]
> >
> > Hmm - well, you're explicitly telling it to insert VALUES (...,
> > new.field3,  ...) so if new.field3 is null then it *should* do that.
>
> I (apparently mistakenly) thought that the point of specifying DEFAULT
> values in the table column definition was so that the default value would
> be inserted automatically rather than a null. And anyway, that IS how it
> seems to work when I do the insert for row A to the table directly with
>
> INSERT INTO test_table VALUES ('A');
>
> where fields 2, 3, and 4 have not been assigned values. Why do they get
> the default in this case?

Because you're not doing
  INSERT INTO test_table VALUES ('A',null,null)

> > Now - how you should go about getting the default I don't know. You
> > could  build a rule with WHERE NEW.field3 IS NULL and then not pass
> > field3, but that  would stop you explicitly setting it to null.
>
> My work-around has been to define BEFORE INSERT triggers with lines like
>
> SELECT INTO new.field3 COALESCE(new.field3, 1);
>
> testing for and optionally assigning the default, but I really don't like
> having to explicitly do that for every table and NOT NULL column, since I
> make pretty much routine use of RULES on VIEWS to make writeable views
> the interface to my user application.
>
> > Out of curiosity, can you tell me what happens if you insert into the
> > view  ('C',DEFAULT,DEFAULT)?
> >   Richard Huxton
>
> Same script, but with
>
>
> INSERT INTO test_table VALUES ('A');
> INSERT INTO test_table_v VALUES ('B');
> INSERT INTO test_table_v VALUES ('C', DEFAULT, DEFAULT);
>
> gives
>
>  field1 | field2 | field3 |     field4
> --------+--------+--------+-----------------
>  A      |      1 |      1 | (default value)
>  B      |      2 |        |
>  C      |      3 |        |
> (3 rows)
>
> -- so no change in behavior. I notice that field2, which was declared
> type SERIAL, and so also has a DEFAULT, but one which calls the nextval
> function rather than simply assigning a value, gets its default value
> assigned in both the table insert and the view insert.

Because you don't specify field2 in your RULE.
--
  Richard Huxton
  Archonet Ltd

В списке pgsql-general по дате отправления:

Предыдущее
От: Martin Marques
Дата:
Сообщение: Re: PostgreSQL versus MySQL
Следующее
От: nolan@celery.tssi.com
Дата:
Сообщение: Re: About Pgdump