본문 바로가기
다른 DBMS/PostgresDB

[postgresql] 데이터타입 총정리

by 취미툰 2024. 4. 2.
반응형

postgresql은 정말 다양한 데이터타입이 있습니다.

 

오라클과 다르게 종류가 훨씬 많더라구요.. 실제로 정리해보고 생성하는것까지 정리하도록 하겠습니다.

 

출처 : https://www.postgresql.org/docs/current/datatype.html

 

1.Numeric 

숫자유형입니다. 2byte 정수, 4byte 정수, 8byte 정수, 4 or 8 byte 부동 소수점 숫자. 선택가능한 정밀 소수점으로 구성되어 있습니다.

 

Name 사이즈 설명 값의 범위
smallint 2 bytes small-range integer
작은 범위의 정수
-32768 to +32767
integer 4 bytes typical choice for integer
일반적인 정수
-2147483648 to +2147483647
bigint 8 bytes large-range integer
큰 범위 정수
-9223372036854775808 to +9223372036854775807
decimal variable user-specified precision, exact
사용자 지정 정밀도,정확도
up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
소수점 이전 최대 131072자리, 소수점 이후 최대 16383자리
numeric variable user-specified precision, exact
사용자 지정 정밀도,정확도
up to 131072 digits before the decimal point; up to 16383 digits after the decimal point
소수점 이전 최대 131072자리, 소수점 이후 최대 16383자리
real 4 bytes variable-precision, inexact
가변적인 변수
6 decimal digits precision
10
진수 6자리 정밀도
double precision 8 bytes variable-precision, inexact
가변적인 변수
15 decimal digits precision
10
진수 6자리 정밀도
smallserial 2 bytes small autoincrementing integer
작은 범위의 자동증가 정수
1 to 32767
serial 4 bytes autoincrementing integer
자동증가 정수
1 to 2147483647
bigserial 8 bytes large autoincrementing integer
큰 범위의 자동증가 정수
1 to 9223372036854775807

 

각 타입의 설명

integer 타입 ( smallint,integer,bigint )

분수 성분이 없는 숫자를 저장합니다. 허용된 범위를 벗어난 값을 저장하려고 하면 오류가 발생합니다.

※생성시 주의사항. decimal,numeric 이외에는 숫자를 따로 설정하는것은 허용되지 않습니다. ex) int(10) bigint(10) ...

 

사용자 지정 정밀도,정확도 타입(decimal,numeric)

사용자 지정으로 자릿수를 설정할 수 있어서 정밀한 숫자 데이터를 저장하는데 유용합니다. 예) 화폐, 돈 관련 된 숫자 데이터

precision는 소수점 포함 숫자의 총 자릿수입니다.

Scale은 소수점 오른쪽의 소수점 숫자의 자릿수입니다. 예) 23.5141은 precision은 6 Scale은 4입니다.

NUMERIC(precision,scale)형식이지만 NUMERIC(precision) NUMERIC으로만 사용할 수도 있습니다.

precision,scale이 없는 Numeric은 제한되지않은 Numeric 입니다. 

 

PostgreSQL 15부터는 scale에 -값이 사용이 가능합니다. 예를들어 Numeric(2,-3)으로 설정되어 있다면 값의 범위는 -99000 ~ 99000이 됩니다. 값은 가장 가까운 천으로 반올림합니다. 

 

decimal과 numeric은 동일합니다. 무엇을 사용해도 됩니다.

 

Floating-Point 타입(real,double precision)

정확하지 않은 가변 정밀도 숫자유형입니다. 부정확하다는것은 일부 값들이 내부 형식으로 정확히 변환될 수 없고 근사치로 저장되므로 값을 저장하고 검색하는 것이 약간의 불일치를 보일 수 있음을 의미합니다.

등식에 대한 두 부동소수점값을 비교하는 것은 항상 예상대로 작동하지 않을 수 있습니다.

 

Serial 타입(smallserial,serial,bigserial)

실제 데이터 타입은 아니고 고유식별자 열을 만들기 위한 표기법의 편의로 생성한 타입입니다. (다른 DB의 AUTO_INCREMENT와 유사)

※ serial 타입의 경우 자동으로 증가되는 시퀀스가 default로 포함되어 있어서 미포함시 자동으로 값이 입력됩니다.

 

생성예제

create table int_test (
a smallint ,
b int ,
c bigint,
d decimal(10,3),
e numeric(10,3),
f real,
g double precision,
h smallserial,
i serial,
j bigserial
);

 

 

 

컬럼타입 확인

SELECT table_catalog,table_schema,table_name,column_name,ordinal_position,column_default,is_nullable,data_type,numeric_precision,numeric_precision_radix,numeric_scale,udt_name
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE 1=1 
 and TABLE_CATALOG = 'postgres' ---DB명
   AND TABLE_NAME    = lower('int_test') --테이블명
 ORDER BY ORDINAL_POSITION;

table_catalog|table_schema|table_name|column_name|ordinal_position|column_default                     |is_nullable|data_type       |numeric_precision|numeric_precision_radix|numeric_scale|udt_name|
-------------+------------+----------+-----------+----------------+-----------------------------------+-----------+----------------+-----------------+-----------------------+-------------+--------+
postgres     |public      |int_test  |a          |               1|                                   |YES        |smallint        |               16|                      2|            0|int2    |
postgres     |public      |int_test  |b          |               2|                                   |YES        |integer         |               32|                      2|            0|int4    |
postgres     |public      |int_test  |c          |               3|                                   |YES        |bigint          |               64|                      2|            0|int8    |
postgres     |public      |int_test  |d          |               4|                                   |YES        |numeric         |               10|                     10|            3|numeric |
postgres     |public      |int_test  |e          |               5|                                   |YES        |numeric         |               10|                     10|            3|numeric |
postgres     |public      |int_test  |f          |               6|                                   |YES        |real            |               24|                      2|             |float4  |
postgres     |public      |int_test  |g          |               7|                                   |YES        |double precision|               53|                      2|             |float8  |
postgres     |public      |int_test  |h          |               8|nextval('int_test_h_seq'::regclass)|NO         |smallint        |               16|                      2|            0|int2    |
postgres     |public      |int_test  |i          |               9|nextval('int_test_i_seq'::regclass)|NO         |integer         |               32|                      2|            0|int4    |
postgres     |public      |int_test  |j          |              10|nextval('int_test_j_seq'::regclass)|NO         |bigint          |               64|                      2|            0|int8    |

 

데이터 삽입 후 확인

insert into int_test values
(1,2,3,4,5,6,7,8,9,10);


select * from int_test ;

a|b|c|d    |e    |f  |g  |h|i|j |
-+-+-+-----+-----+---+---+-+-+--+
1|2|3|4.000|5.000|6.0|7.0|8|9|10|


insert into int_test (a,b,c,d,e,f,g) values (1,2,3,4,5,6,7); x3


a|b|c|d    |e    |f  |g  |h|i|j |
-+-+-+-----+-----+---+---+-+-+--+
1|2|3|4.000|5.000|6.0|7.0|8|9|10|
1|2|3|4.000|5.000|6.0|7.0|1|1| 1|
1|2|3|4.000|5.000|6.0|7.0|2|2| 2|
1|2|3|4.000|5.000|6.0|7.0|3|3| 3|

 

 

 

2.Monetary

고정된 함수 precision로 화폐금액을 저장합니다.

함수 precision은 lc_monetary 설정에 의해 결정됩니다.

Name 사이즈 설명 값의 범위
money 8 bytes currency amount -92233720368547758.08 to +92233720368547758.07

 

예시)

SELECT '12.34'::float8::numeric::money;


money |
------+
$12.34|

 

 

3. Character

두가지 문자유형 (고정문자,가변문자)를 정의합니다. 이 두가지 유형은 최대 n자까지 저장할 수 있습니다. (bytes가 아님)

varchar는 character varying의 별칭입니다. char는 character의 별칭입니다.

문자열 보다 긴 문자열을 저장하려하면 에러가 발생합니다. n보다 작은 문자를 입력하면 n개의 문자가 다 저장됩니다.

bpchar는 postgreSQL의 extension입니다. 

text는 가변무제한 길이 형식의 문자형입니다. 

Name 설명
character varying(n)varchar(n) variable-length with limit
길이의 제한이 있는 가변형
character(n)char(n)bpchar(n) fixed-length, blank-padded
고정길이,blank-padded
bpchar variable unlimited length, blank-trimmed
가변 무제한 길이, blank-trimmed
text variable unlimited length
가변 무제한 길이

 

생성예제

varchar와 character varying, character와 char는 동일한 성격인것을 확인할 수 있습니다.

create table cha_test (
a varchar(100),
b character varying(100),
c character(100),
d char(100),
e bpchar(100), 
f text
);

table_catalog|table_schema|table_name|column_name|ordinal_position|column_default|is_nullable|data_type        |character_maximum_length|character_octet_length|numeric_precision|numeric_precision_radix|numeric_scale|datetime_precision|interval_type|interval_precision|character_set_catalog|character_set_schema|character_set_name|collation_catalog|collation_schema|collation_name|domain_catalog|domain_schema|domain_name|udt_catalog|udt_schema|udt_name|scope_catalog|scope_schema|scope_name|maximum_cardinality|dtd_identifier|is_self_referencing|is_identity|identity_generation|identity_start|identity_increment|identity_maximum|identity_minimum|identity_cycle|is_generated|generation_expression|is_updatable|
-------------+------------+----------+-----------+----------------+--------------+-----------+-----------------+------------------------+----------------------+-----------------+-----------------------+-------------+------------------+-------------+------------------+---------------------+--------------------+------------------+-----------------+----------------+--------------+--------------+-------------+-----------+-----------+----------+--------+-------------+------------+----------+-------------------+--------------+-------------------+-----------+-------------------+--------------+------------------+----------------+----------------+--------------+------------+---------------------+------------+
postgres     |public      |cha_test  |a          |               1|              |YES        |character varying|                     100|                   400|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|varchar |             |            |          |                   |1             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |
postgres     |public      |cha_test  |b          |               2|              |YES        |character varying|                     100|                   400|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|varchar |             |            |          |                   |2             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |
postgres     |public      |cha_test  |c          |               3|              |YES        |character        |                     100|                   400|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|bpchar  |             |            |          |                   |3             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |
postgres     |public      |cha_test  |d          |               4|              |YES        |character        |                     100|                   400|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|bpchar  |             |            |          |                   |4             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |
postgres     |public      |cha_test  |e          |               5|              |YES        |character        |                     100|                   400|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|bpchar  |             |            |          |                   |5             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |
postgres     |public      |cha_test  |f          |               6|              |YES        |text             |                        |            1073741824|                 |                       |             |                  |             |                  |                     |                    |                  |                 |                |              |              |             |           |postgres   |pg_catalog|text    |             |            |          |                   |6             |NO                 |NO         |                   |              |                  |                |                |NO            |NEVER       |                     |YES         |

 

테스트

char로 생성했을시에는 뒤에 공백이 포함되지 않습니다. 앞에 공백 첫문자 나올때까지만 lenghth로 저장됩니다.

varchar는 공백을 포함해서 저장됩니다. Oracle에 익숙한 저로써는 이부분이 신기하면서도 헷갈리네요. 공백포함하여 varchar가 4자리는 이해가 되는데 char는 뒤에 공백이 잘려서 4가 아닌게.. postgresql의 특성으로 이해하고 넘어가야 겠습니다.  

 

 CREATE TABLE char_test3 (a character(4) ,b varchar(4));

INSERT INTO char_test3 VALUES ('A   ','A   ');
INSERT INTO char_test3 VALUES ('  A ','  A ');
INSERT INTO char_test3 VALUES (' A  ',' A  ');

SELECT a, char_length(a),b,char_length(b)  FROM char_test3;

a   |char_length|b   |char_length|
----+-----------+----+-----------+
A   |          1|A   |          4|
  A |          3|  A |          4|
 A  |          2| A  |          4|

 

5보다 큰 값 입력시 에러 발생. 공백으로 5보다 더 큰 값으로 입력시 5까지만 입력됨.good 값 컬럼.

CREATE TABLE char_test2 (b varchar(5));
INSERT INTO char_test2 VALUES ('ok');
INSERT INTO char_test2 VALUES ('good      ');
INSERT INTO char_test2 VALUES ('too long'); -- 5보다 큰 값 입력시
--SQL Error [22001]: ERROR: value too long for type character varying(5)


INSERT INTO char_test2 VALUES ('too long'::varchar(5)); -- 외부 함수로
SELECT b, char_length(b) FROM char_test2;

b    |char_length|
-----+-----------+
ok   |          2|
good |          5|
too l|          5|

 

 

4.Binary

Name 사이즈 설명
bytea 1 or 4 bytes plus the actual binary string
1 or 4 bytes +실제 이진 문자열
variable-length binary string
가변 길이 이진 문자열

 

binary 타입은 두가지 포맷을 지원합니다. hex와 escape입니다. 두가지 형식은 bytea_output 파라미터에 따라 달라지며 default는 hex입니다.

SET bytea_output = 'hex';

SELECT '\xDEADBEEF'::bytea;
   bytea
------------
 \xdeadbeef
 
 
 SET bytea_output = 'escape';

SELECT 'abc \153\154\155 \052\251\124'::bytea;
     bytea
----------------
 abc klm *\251T

 

5.Date/Time

 

Name 사이즈 설명 최소값 최고값 Resolution
timestamp [ (p) ] [ without time zone ] 8 bytes both date and time (no time zone) 4713 BC 294276 AD 1 microsecond
timestamp [ (p) ] with time zone 8 bytes both date and time, with time zone 4713 BC 294276 AD 1 microsecond
date 4 bytes date (no time of day) 4713 BC 5874897 AD 1 day
time [ (p) ] [ without time zone ] 8 bytes time of day (no date) 0:00:00 24:00:00 1 microsecond
time [ (p) ] with time zone 12 bytes time of day (no date), with time zone 00:00:00+1559 24:00:00-1559 1 microsecond
interval [ fields ] [ (p) ] 16 bytes time interval -178000000 years 178000000 years 1 microsecond

 

time,timestamp,interval은 선택적인 정밀도 값 p를 사용할 수 있으며 이 값은 초의 자릿수를 지정합니다.

p는 0 - 6을 사용할 수 있습니다.

 

interval은 아래중 하나를 사용하여 저장된 데이터의 집합을 제한할 수 있습니다.

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
DAY TO HOUR
DAY TO MINUTE
DAY TO SECOND
HOUR TO MINUTE
HOUR TO SECOND
MINUTE TO SECOND

 

생성 예제

create table date_test (
a timestamp without time zone ,
a_1 timestamp(6) without time zone, 
b timestamp with time zone,
b_1 timestamp(6) with time zone,
c date,
d time without time zone, 
d_1 time(6) without time zone, 
e time with time zone,
e_1 time(6) with time zone,
f interval
);


table_catalog|table_schema|table_name|column_name|ordinal_position|column_default|is_nullable|data_type                  |numeric_precision|numeric_precision_radix|numeric_scale|udt_name   |
-------------+------------+----------+-----------+----------------+--------------+-----------+---------------------------+-----------------+-----------------------+-------------+-----------+
postgres     |public      |date_test |a          |               1|              |YES        |timestamp without time zone|                 |                       |             |timestamp  |
postgres     |public      |date_test |a_1        |               2|              |YES        |timestamp without time zone|                 |                       |             |timestamp  |
postgres     |public      |date_test |b          |               3|              |YES        |timestamp with time zone   |                 |                       |             |timestamptz|
postgres     |public      |date_test |b_1        |               4|              |YES        |timestamp with time zone   |                 |                       |             |timestamptz|
postgres     |public      |date_test |c          |               5|              |YES        |date                       |                 |                       |             |date       |
postgres     |public      |date_test |d          |               6|              |YES        |time without time zone     |                 |                       |             |time       |
postgres     |public      |date_test |d_1        |               7|              |YES        |time without time zone     |                 |                       |             |time       |
postgres     |public      |date_test |e          |               8|              |YES        |time with time zone        |                 |                       |             |timetz     |
postgres     |public      |date_test |e_1        |               9|              |YES        |time with time zone        |                 |                       |             |timetz     |
postgres     |public      |date_test |f          |              10|              |YES        |interval                   |                 |                       |             |interval   |

;

insert into date_test (a,a_1,b,b_1,c,d,d_1,e,e_1)
values
(current_timestamp,current_timestamp,current_timestamp,current_timestamp,current_timestamp,current_timestamp
,current_timestamp,current_timestamp,current_timestamp)
;

select * from date_test;


--6
a                      |a_1                    |b                            |b_1                          |c         |d       |d_1     |e             |e_1           |f|
-----------------------+-----------------------+-----------------------------+-----------------------------+----------+--------+--------+--------------+--------------+-+
2024-04-04 11:12:17.428|2024-04-04 11:12:17.428|2024-04-04 11:12:17.428 +0900|2024-04-04 11:12:17.428 +0900|2024-04-04|11:12:17|11:12:17|11:12:17 +0900|11:12:17 +0900| |

 

5.Date/Time

날짜와 시간을 나타내는 타입입니다.

Name Storage Size Description Low Value High Value Resolution
timestamp [ (p) ] [ without time zone ] 8 bytes both date and time (no time zone) 4713 BC 294276 AD 1 microsecond
timestamp [ (p) ] with time zone 8 bytes both date and time, with time zone 4713 BC 294276 AD 1 microsecond
date 4 bytes date (no time of day) 4713 BC 5874897 AD 1 day
time [ (p) ] [ without time zone ] 8 bytes time of day (no date) 0:00:00 24:00:00 1 microsecond
time [ (p) ] with time zone 12 bytes time of day (no date), with time zone 00:00:00+1559 24:00:00-1559 1 microsecond
interval [ fields ] [ (p) ] 16 bytes time interval -178000000 years 178000000 years 1 microsecond

 

6.Boolean

True,False 그리고 unnkown으로 구성된 타입입니다.

 

7.Enumerate

열거형 유형(enum)은 순서가 지정된 값 집합을 구성하는 데이터유형입니다.

CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');

CREATE TABLE person (
    name text,
    current_mood mood
);

INSERT INTO person VALUES ('Moe', 'happy');
SELECT * FROM person WHERE current_mood = 'happy';
 name | current_mood
------+--------------
 Moe  | happy

 

8.Geometric

2차원 공간 객체를 나타내는 데이터타입입니다.

 

9.Network Address

IPv4,IPv6,MAC 주소를 저장하는 데이터유형입니다.

 

 

10.UUID


UUID는 하이픈으로 구분된 여러 그룹, 특히 8자리 그룹, 4자리 그룹, 12자리 그룹, 128비트를 나타내는 총 32자리에 대해 16진수 소문자로 작성됩니다:

A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
a0eebc999c0b4ef8bb6d6bb9bd380a11
a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
{a0eebc99-9c0b4ef8-bb6d6bb9-bd380a11}




11.XML
XML 데이터를 저장하는 데 사용될 수 있습니다.

XMLPARSE (DOCUMENT '<?xml version="1.0"?><book><title>Manual</title><chapter>...</chapter></book>')
XMLPARSE (CONTENT 'abc<foo>bar</foo><bar>foo</bar>')


12.JSON
 JSON(JavaScript Object Notification) 데이터를 저장하기 위한 것입니다.

SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
json                                           |
-----------------------------------------------+
{"bar": "baz", "balance": 7.77, "active":false}|



13.Array
생성예제

CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);




위의 테이블은 pay_by_quarter (integer 1차원 배열),schedule(text 2차원배열)로 이루어져있는 sal_emp테이블입니다.

array의 값의 입력 예제는 아래와 같습니다.

'{ val1 delim val2 delim ... }'
delim은 pg_type에 기록된 구분자 문자입니다. 세미콜론(;)을 사용하는 일부를 제외하고는 모두 쉼표(,)를 사용합니다.



입력 예제

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"training", "presentation"}}');

INSERT INTO sal_emp
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');




SELECT * FROM sal_emp;
 name  |      pay_by_quarter       |                 schedule
-------+---------------------------+-------------------------------------------
 Bill  | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
 Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}
(2 rows)




다차원 array는 각 차원에 일치하는 범위를 가져야합니다 그렇지않으면 에러를 발생합니다.

 schedule의 두번째 값이 하나의 값만 들어가있어서 형식이 일치하지 않아 에러가 발생합니다.

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"meeting"}}');
   
에러 발생 : ERROR:  multidimensional arrays must have array expressions with matching dimensions



조회

배열의 순번은 1부터 시작합니다. array[1] 부터 array[n]으로 끝납니다.

SELECT name FROM sal_emp WHERE pay_by_quarter[1] <> pay_by_quarter[2];
name |
-----+
Carol|

SELECT pay_by_quarter[3] FROM sal_emp;
pay_by_quarter|
--------------+
         10000|
         25000|




array의 subarray 또는 array slice에 액세스할 수 있습니다. array slice 는 하나 이상의 array차원에 대해 lower-bound:upper-bound 로 씁니다. 이 쿼리는 빌의 스케줄에서 일주일 중 처음 이틀 동안의 첫 번째 항목을 검색합니다.

컬럼[array값의 범위] [값 안에서의 범위]입니다. 즉 현재 bill의 schedule의 값은 {{meeting,lunch},{training,presentation}} 인데 첫번째 값이[1:2] 이므로 값 다가 해당되고, 두번째 [1:1]이므로 각각 첫번째의 값만 가져오는 것입니다.

SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';

schedule              |
----------------------+
{{meeting},{training}}|




단일 숫자만 있는 차수는 1로 처리됩니다. [2]는 [1:2]로 처리됩니다.

SELECT schedule[1:2][2] FROM sal_emp WHERE name = 'Bill';
schedule                                 |
-----------------------------------------+
{{meeting,lunch},{training,presentation}}|



값의 변경

UPDATE sal_emp SET pay_by_quarter = '{25000,25000,27000,27000}'
    WHERE name = 'Carol';
    
UPDATE sal_emp SET pay_by_quarter = ARRAY[25000,25000,27000,27000]
    WHERE name = 'Carol';
    
UPDATE sal_emp SET pay_by_quarter[4] = 15000
    WHERE name = 'Bill';
    
UPDATE sal_emp SET pay_by_quarter[1:2] = '{27000,27000}'
    WHERE name = 'Carol';




14.Composite
행 또는 레코드의 구조를 나타내며 기본적으로 필드이름과 해당 데이터유형의 목록일 뿐입니다.

아래와 같이 복합 구조를 사용자가 생성할 수 있습니다. 

사용하자 원하는 타입을 생성해서 관리하는 부분이 oracle과 다른부분이네요.

CREATE TYPE complex AS (
    r       double precision,
    i       double precision
);

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



생성한 타입을 실제로 테이블 생성시에 적용할 수 있습니다.

CREATE TABLE on_hand (
    item      inventory_item,
    count     integer
);

INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000);

select * from on_hand;
item                |count|
--------------------+-----+
(fuzzy dice,42,1.99)| 1000|




15.Range
일부요소 유형의 값 범위를 나타내는 데이터 유형입니다.

int4range — Range of integer, int4multirange — corresponding Multirange
int8range — Range of bigint, int8multirange — corresponding Multirange
numrange — Range of numeric, nummultirange — corresponding Multirange
tsrange — Range of timestamp without time zone, tsmultirange — corresponding Multirange
tstzrange — Range of timestamp with time zone, tstzmultirange — corresponding Multirange
daterange — Range of date, datemultirange — corresponding Multirange



생성 예제

CREATE TABLE reservation (room int, during tsrange);
INSERT INTO reservation VALUES
    (1108, '[2010-01-01 14:30, 2010-01-01 15:30)');
    
select * from reservation;
room|during                                       |
----+---------------------------------------------+
1108|["2010-01-01 14:30:00","2010-01-01 15:30:00")|




16.Domain
다른 기본유형을 기반으로 하는 사용자 정의 데이터 유형입니다.

선택적으로 해당 도메인은 기본 유형이 허용하는 부분집합으로 유효한 값을 제한하는 제약조건을 가질 수 있습니다.



생성 예제

CREATE DOMAIN posint AS integer CHECK (VALUE > 0);
CREATE TABLE mytable (id posint);
INSERT INTO mytable VALUES(1);   -- works

INSERT INTO mytable VALUES(-1);  -- fails
ERROR: value for domain posint violates check constraint "posint_check"




17.Object identifer
OID라고도 불리며, 내부적으로 다양한 시스템 테이블의 기본키로 사용됩니다. 개체식별자로도 불립니다.



18.pg_lsn
WAL의 위치에 대한 포인터인 LSN(Log Sequence Number)데이터를 저장하는데 사용됩니다.



19.Pseudo
pesudo 타입으로 통칭되는 여러 특수목적 엔트리가 포함되어 있습니다. 컬럼 유형으로는 사용할 수 없으나, 함수의 인수 또는 결과 유형을 선언하는데 사용할 수 있습니다.





다양한 데이터타입이 있고, 그중에서 사용자가 많이 쓰는 데이터타입들은 알아두면 좋을것 같습니다.

반응형

댓글