Обсуждение: Select default values
Hi there, just a quickie: Is there a way to select all default values of a given table? Something like "Select Default values from sometable" ? Unfortunately this syntax doesn't seem to be supported. I know i can select the default values for each column, but being able to select them in one go would be handy... tia, Maximilian Tyrtania
am Wed, dem 23.07.2008, um 10:32:58 +0200 mailte Maximilian Tyrtania folgendes: > Hi there, just a quickie: Is there a way to select all default values of a > given table? Something like "Select Default values from sometable" ? > Unfortunately this syntax doesn't seem to be supported. I know i can select > the default values for each column, but being able to select them in one go > would be handy... test=# create table t_with_defaults( s1 int default 1, s2 int default 2); CREATE TABLE test=*# select ordinal_position, column_name, column_default from information_schema.columns where table_name='t_with_defaults'order by 1;ordinal_position | column_name | column_default ------------------+-------------+---------------- 1 | s1 | 1 2 | s2 | 2 (2 rows) HTH, Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net
Hello 2008/7/23 Maximilian Tyrtania <maximilian.tyrtania@onlinehome.de>: > Hi there, just a quickie: Is there a way to select all default values of a > given table? Something like "Select Default values from sometable" ? > Unfortunately this syntax doesn't seem to be supported. I know i can select > the default values for each column, but being able to select them in one go > would be handy... it's not possible directly, you can find expressions used as default in system tables or postgres=# create table f(a integer default 1, b integer); CREATE TABLE postgres=# insert into f(a,b) values(default, default) returning *;a | b ---+---1 | (1 row) INSERT 0 1 regards Pavel Stehule > > tia, > > Maximilian Tyrtania > > > > -- > Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-sql >
Hi again, >> Hi there, just a quickie: Is there a way to select all default values of a >> given table? Something like "Select Default values from sometable" ? > it's not possible directly, you can find expressions used as default > in system tables or > postgres=# create table f(a integer default 1, b integer); > CREATE TABLE > postgres=# insert into f(a,b) values(default, default) returning *; > a | b > ---+--- > 1 | > (1 row) > > INSERT 0 1 > regards > Pavel Stehule ah, I see, smart, the problem with this is just that I don't actually want to insert the record just yet. I just want to hand the default values over to my app. Well, of course my app could still delete the record later on, but still that seems cumbersome.. Thanks a lot and best wishes from Berlin, Maximilian Tyrtania
Hi,
> am Wed, dem 23.07.2008, um 10:32:58 +0200 mailte Maximilian Tyrtania
> folgendes:
>> Hi there, just a quickie: Is there a way to select all default values of a
>> given table? Something like "Select Default values from sometable" ?
>
> test=# create table t_with_defaults( s1 int default 1, s2 int default 2);
> CREATE TABLE
> test=*# select ordinal_position, column_name, column_default from
> information_schema.columns where table_name='t_with_defaults' order by 1;
> ordinal_position | column_name | column_default
> ------------------+-------------+----------------
> 1 | s1 | 1
> 2 | s2 | 2
> (2 rows)
This is probably what I should do, the only problem is that the output of
the given query looks a lot less nice when the default looks like this
nextval('mitarbeiter_serial'::regclass)
I'd prefer to just receive the actual value of that function. Okay, I could
just execute that statement, but, hmm, still, that seems akward.
Thanks and best wishes from Berlin
Maximilian Tyrtania
2008/7/23 Maximilian Tyrtania <maximilian.tyrtania@onlinehome.de>: > Hi again, > >>> Hi there, just a quickie: Is there a way to select all default values of a >>> given table? Something like "Select Default values from sometable" ? > >> it's not possible directly, you can find expressions used as default >> in system tables or >> postgres=# create table f(a integer default 1, b integer); >> CREATE TABLE >> postgres=# insert into f(a,b) values(default, default) returning *; >> a | b >> ---+--- >> 1 | >> (1 row) >> >> INSERT 0 1 >> regards >> Pavel Stehule > > ah, I see, smart, the problem with this is just that I don't actually want > to insert the record just yet. I just want to hand the default values over > to my app. Well, of course my app could still delete the record later on, > but still that seems cumbersome.. begin insert ...rollback; it's not best solution, but it just works. regards Pavel > > Thanks a lot and best wishes from Berlin, > > Maximilian Tyrtania > > >
Hi, > begin > insert ... > rollback; > > it's not best solution, but it just works. Ah, yes, of course, haven't thought of that. Okay, here is one final (i hope) obstacle. My db has >200 tables and I'd love to be able to write some function that would just take a tablename and return the default values for a new record of that table. If "Select default values from sometable" was supported than that would be a piece of cake (I'd just do: Execute "Select default values from '||sometable||' into somerecord" in a plpgsql function). With your way (insert into f(a,b) values(default, default) returning *) i need to know everything about the given table. Hmm. Any ideas? Best, Maximilian Tyrtania
On Wed, Jul 23, 2008 at 12:35:08PM +0200, Maximilian Tyrtania wrote: > With your way (insert into f(a,b) values(default, default) returning *) i > need to know everything about the given table. > > Hmm. Any ideas? Do look at the information schema. Karsten -- GPG key ID E4071346 @ wwwkeys.pgp.net E167 67FD A291 2BEA 73BD 4537 78B9 A9F9 E407 1346
2008/7/23 Maximilian Tyrtania <maximilian.tyrtania@onlinehome.de>:
> Hi,
>
>> begin
>> insert ...
>> rollback;
>>
>> it's not best solution, but it just works.
>
> Ah, yes, of course, haven't thought of that.
>
> Okay, here is one final (i hope) obstacle. My db has >200 tables and I'd
> love to be able to write some function that would just take a tablename and
> return the default values for a new record of that table. If "Select default
> values from sometable" was supported than that would be a piece of cake (I'd
> just do: Execute "Select default values from '||sometable||' into
> somerecord" in a plpgsql function).
>
that is out of SQL principles :(. And you cannot have functions that
returns different number of columns - your function, can return array
or table
CREATE OR REPLACE FUNCTION defaults(text, OUT attname name, OUT type
varchar, OUT default_val varchar)
RETURNS SETOF RECORD AS $$
SELECT a.attname, pg_catalog.format_type(a.atttypid, a.atttypmod), (SELECT eval(pg_catalog.pg_get_expr(d.adbin,
d.adrelid)) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
FROM pg_catalog.pg_attribute a
WHERE a.attrelid = $1::regclass::oid AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
$$ LANGUAGE SQL STRICT;
postgres=# \d fg Table "public.fg"Column | Type | Modifiers
--------+------+-----------------------------t | date | default ('now'::text)::date
postgres=# \d f Table "public.f"Column | Type | Modifiers
--------+---------+-----------a | integer | default 1b | integer |
postgres=# select * from defaults('fg');attname | type | default_val
---------+------+-------------t | date | 2008-07-23
(1 row)
postgres=# select * from defaults('f');attname | type | default_val
---------+---------+-------------a | integer | 1b | integer |
(2 rows)
regards
Pavel Stehule
create or replace function eval(varchar) returns varchar as $$
declare result varchar;
begin execute 'SELECT ' || $1 into result; return result;
end;$$ language plpgsql strict;
> With your way (insert into f(a,b) values(default, default) returning *) i
> need to know everything about the given table.
>
> Hmm. Any ideas?
>
> Best,
>
> Maximilian Tyrtania
>
>
>
Pavel,
fantastic, that's exactly what I wanted, thank you very much!
Maximilian Tyrtania
> Von: Pavel Stehule <pavel.stehule@gmail.com>
>> Okay, here is one final (i hope) obstacle. My db has >200 tables and I'd
>> love to be able to write some function that would just take a tablename and
>> return the default values for a new record of that table. If "Select default
>> values from sometable" was supported than that would be a piece of cake (I'd
>> just do: Execute "Select default values from '||sometable||' into
>> somerecord" in a plpgsql function).
>>
>
> that is out of SQL principles :(. And you cannot have functions that
> returns different number of columns - your function, can return array
> or table
>
> CREATE OR REPLACE FUNCTION defaults(text, OUT attname name, OUT type
> varchar, OUT default_val varchar)
> RETURNS SETOF RECORD AS $$
> SELECT a.attname,
> pg_catalog.format_type(a.atttypid, a.atttypmod),
> (SELECT eval(pg_catalog.pg_get_expr(d.adbin, d.adrelid))
> FROM pg_catalog.pg_attrdef d
> WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
> FROM pg_catalog.pg_attribute a
> WHERE a.attrelid = $1::regclass::oid AND a.attnum > 0 AND NOT a.attisdropped
> ORDER BY a.attnum
> $$ LANGUAGE SQL STRICT;
>
> postgres=# \d fg
> Table "public.fg"
> Column | Type | Modifiers
> --------+------+-----------------------------
> t | date | default ('now'::text)::date
>
> postgres=# \d f
> Table "public.f"
> Column | Type | Modifiers
> --------+---------+-----------
> a | integer | default 1
> b | integer |
>
> postgres=# select * from defaults('fg');
> attname | type | default_val
> ---------+------+-------------
> t | date | 2008-07-23
> (1 row)
>
> postgres=# select * from defaults('f');
> attname | type | default_val
> ---------+---------+-------------
> a | integer | 1
> b | integer |
> (2 rows)
>
> regards
> Pavel Stehule
>
> create or replace function eval(varchar) returns varchar as $$
> declare result varchar;
> begin
> execute 'SELECT ' || $1 into result;
> return result;
> end;$$ language plpgsql strict;
On Wed, Jul 23, 2008 at 3:57 AM, Maximilian Tyrtania
<maximilian.tyrtania@onlinehome.de> wrote:
> Hi,
>
>> am Wed, dem 23.07.2008, um 10:32:58 +0200 mailte Maximilian Tyrtania
>> folgendes:
>>> Hi there, just a quickie: Is there a way to select all default values of a
>>> given table? Something like "Select Default values from sometable" ?
>>
>> test=# create table t_with_defaults( s1 int default 1, s2 int default 2);
>> CREATE TABLE
>> test=*# select ordinal_position, column_name, column_default from
>> information_schema.columns where table_name='t_with_defaults' order by 1;
>> ordinal_position | column_name | column_default
>> ------------------+-------------+----------------
>> 1 | s1 | 1
>> 2 | s2 | 2
>> (2 rows)
>
> This is probably what I should do, the only problem is that the output of
> the given query looks a lot less nice when the default looks like this
>
> nextval('mitarbeiter_serial'::regclass)
>
> I'd prefer to just receive the actual value of that function. Okay, I could
> just execute that statement, but, hmm, still, that seems akward.
Until you run that function, you don't know what the output might be
because of possible race condtitions.
On 23/lug/08, at 11:28, Pavel Stehule wrote: > Hello > > 2008/7/23 Maximilian Tyrtania <maximilian.tyrtania@onlinehome.de>: >> Hi there, just a quickie: Is there a way to select all default >> values of a >> given table? Something like "Select Default values from sometable" ? >> Unfortunately this syntax doesn't seem to be supported. I know i >> can select >> the default values for each column, but being able to select them >> in one go >> would be handy... > > > it's not possible directly, you can find expressions used as default > in system tables or > postgres=# create table f(a integer default 1, b integer); > CREATE TABLE > postgres=# insert into f(a,b) values(default, default) returning *; It seems that you can’t use the same syntax with function calls: select function(default,default); gives a syntax error. Is it expected? -- Giorgio Valoti
Giorgio Valoti wrote: > >> postgres=# insert into f(a,b) values(default, default) returning *; > > It seems that you can’t use the same syntax with function calls: > select function(default,default); > gives a syntax error. Is it expected? Um - there is no default value for a function. -- Richard Huxton Archonet Ltd
On 24/lug/08, at 12:42, Richard Huxton wrote: > Giorgio Valoti wrote: >>> postgres=# insert into f(a,b) values(default, default) returning *; >> It seems that you can’t use the same syntax with function calls: >> select function(default,default); >> gives a syntax error. Is it expected? > > Um - there is no default value for a function. Yes, but you could define a domain with a default value and using it as an IN argument for a function. In that case it would handy to be able to use the default value, wouldn’t it? Without this "feature" you have to overload the function arguments. -- Giorgio Valoti
On Thu, Jul 24, 2008 at 12:35 PM, Giorgio Valoti <giorgio_v@mac.com> wrote: >> Um - there is no default value for a function. > > Without this "feature" you have to overload > the function arguments. You could pass a casted null to the function. The would eliminate function overloading. Then internally you could handle the null by passing DEFAULTS to you INSERT or UPDATE statements. I don't know if this would work for you in this case. -- Regards, Richard Broersma Jr. Visit the Los Angles PostgreSQL Users Group (LAPUG) http://pugs.postgresql.org/lapug
On 24/lug/08, at 23:15, Richard Broersma wrote: > On Thu, Jul 24, 2008 at 12:35 PM, Giorgio Valoti > <giorgio_v@mac.com> wrote: > >>> Um - there is no default value for a function. >> >> Without this "feature" you have to overload >> the function arguments. > > You could pass a casted null to the function. The would eliminate > function overloading. Then internally you could handle the null by > passing DEFAULTS to you INSERT or UPDATE statements. I don't know if > this would work for you in this case. It could work but only if I use a domain that allows NULLs, which reduces the usefulness of domains even if you can work around that by simply stating the not null clause in the table definition. -- Giorgio Valoti