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 타입으로 통칭되는 여러 특수목적 엔트리가 포함되어 있습니다. 컬럼 유형으로는 사용할 수 없으나, 함수의 인수 또는 결과 유형을 선언하는데 사용할 수 있습니다.
다양한 데이터타입이 있고, 그중에서 사용자가 많이 쓰는 데이터타입들은 알아두면 좋을것 같습니다.
'다른 DBMS > PostgresDB' 카테고리의 다른 글
[PG16] redhat 8버전에 pg16설치하고 데이터 이관하기 (0) | 2024.07.24 |
---|---|
오류: 기타 다른 개체들이 이 롤에 의존하고 있어, "유저명" 롤을 삭제할 수 없음 (0) | 2024.05.29 |
vacuum 과 vacuum full 차이 보기 (pageinspect extention 사용) (0) | 2024.03.31 |
postgres extention contrib 확장팩 설치 (0) | 2024.03.30 |
DB 설치 후 client tool과 외부 연결하기 (2) | 2023.11.22 |
댓글