how to create a new composite type using already existing composite types

Started by Iain Barnettabout 16 years ago3 messagesgeneral
Jump to latest
#1Iain Barnett
iainspeed@gmail.com

Hi,

Is there a way to create a new composite type using already existing composite type?

For example,

CREATE TABLE inventory_item (
name text,
supplier_id integer REFERENCES suppliers,
price numeric CHECK (price > 0)
);

produces the following type automatically
CREATE TYPE inventory_item AS (
name text,
supplier_id integer,
price numeric
);

but I'd also like to have a type with an extra column for certain functions

CREATE TYPE inventory_item2 AS (
name text,
supplier_id integer,
price numeric,
size integer
);

but it would be handy if I could reuse inventory_item instead of having to retype the whole lot. I can't work out or find the right syntax, can anyone show me how? Any help would be much appreciated.

Regards
Iain

#2Jeff Davis
pgsql@j-davis.com
In reply to: Iain Barnett (#1)
Re: how to create a new composite type using already existing composite types

On Wed, 2010-02-10 at 03:46 +0000, Iain Barnett wrote:

CREATE TYPE inventory_item2 AS (
name text,
supplier_id integer,
price numeric,
size integer
);

but it would be handy if I could reuse inventory_item instead of
having to retype the whole lot. I can't work out or find the right
syntax, can anyone show me how? Any help would be much appreciated.

What about:

CREATE TYPE inventory_item2 AS (
ii inventory_item,
size integer
);

or:

CREATE TABLE inventory_item2 (
LIKE inventory_item,
size integer
);

and that will automatically create the type.

Regards,
Jeff Davis

#3Merlin Moncure
mmoncure@gmail.com
In reply to: Jeff Davis (#2)
Re: how to create a new composite type using already existing composite types

On Sat, Feb 13, 2010 at 7:24 PM, Jeff Davis <pgsql@j-davis.com> wrote:

On Wed, 2010-02-10 at 03:46 +0000, Iain Barnett wrote:

CREATE TYPE inventory_item2 AS (
    name            text,
    supplier_id     integer,
    price           numeric,
size  integer
);

but it would be handy if I could reuse inventory_item instead of
having to retype the whole lot. I can't work out or find the right
syntax, can anyone show me how? Any help would be much appreciated.

What about:

 CREATE TYPE inventory_item2 AS (
   ii inventory_item,
   size integer
 );

or:

 CREATE TABLE inventory_item2 (
   LIKE inventory_item,
   size integer
 );

Pretty neat. I wasn't aware you could mix LIKE with explicit field
declarations.

Those expressions produce different results...the first creates a type
within a type (nested) and the second creates a new unnested type
based on the fields of the original type. The first expression
creates a dependency while the second does not. This flexibility is
only possible if you create types with the 'create table' statement.

merlin