CREATE TYPE
CREATE TYPE defines a custom data type, which let you create named versions of
anonymous types or provide a shorthand for other types. For more information,
see SQL Data Types: Custom types.
Syntax
Row type
CREATE TYPE <type_name> AS (<field_name> <field_type>, ...);
| Syntax element | Description |
|---|---|
<type_name>
|
A name for the type. |
<field_name>
|
The name of a field in a row type. |
<field_type>
|
The data type of a field indicated by field_name.
|
List type
CREATE TYPE <type_name> AS LIST (ELEMENT TYPE = <element_type>);
| Syntax element | Description |
|---|---|
<type_name>
|
A name for the type. |
<element_type>
|
Creates a custom list whose elements are of
<element_type>.
|
Map type
CREATE TYPE <type_name> AS MAP (KEY TYPE = <key_type>, VALUE TYPE = <value_type>);
| Syntax element | Description |
|---|---|
<type_name>
|
A name for the type. |
<key_type>
|
Creates a custom map whose keys are of <key_type>.
Must resolve to text.
|
<value_type>
|
Creates a custom map whose values are of <value_type>.
|
Details
For details about the custom types CREATE TYPE creates, see SQL Data Types:
Custom types.
Properties
All custom type properties’ values must refer to named types, e.g.
integer.
To create a custom nested list or map, you must first create a custom list
or map. This creates a named type, which can then be referred to in another
custom type’s properties.
Examples
Custom list
CREATE TYPE int4_list AS LIST (ELEMENT TYPE = int4);
SELECT '{1,2}'::int4_list::text AS custom_list;
custom_list
-------------
{1,2}
Nested custom list
CREATE TYPE int4_list_list AS LIST (ELEMENT TYPE = int4_list);
SELECT '{{1,2}}'::int4_list_list::text AS custom_nested_list;
custom_nested_list
--------------------
{{1,2}}
Custom map
CREATE TYPE int4_map AS MAP (KEY TYPE = text, VALUE TYPE = int4);
SELECT '{a=>1}'::int4_map::text AS custom_map;
custom_map
------------
{a=>1}
Nested custom map
CREATE TYPE int4_map_map AS MAP (KEY TYPE = text, VALUE TYPE = int4_map);
SELECT '{a=>{a=>1}}'::int4_map_map::text AS custom_nested_map;
custom_nested_map
-------------------
{a=>{a=>1}}
Custom row type
CREATE TYPE row_type AS (a int, b text);
SELECT ROW(1, 'a')::row_type as custom_row_type;
custom_row_type
-----------------
(1,a)
Nested row type
CREATE TYPE nested_row_type AS (a row_type, b float8);
SELECT ROW(ROW(1, 'a'), 2.3)::nested_row_type AS custom_nested_row_type;
custom_nested_row_type
------------------------
("(1,a)",2.3)
Privileges
The privileges required to execute this statement are:
CREATEprivileges on the containing schema.USAGEprivileges on all types used in the type definition.USAGEprivileges on the schemas that all types in the statement are contained in.