ALTER TABLE — 테이블 정의 바꾸기
ALTER TABLE [ IF EXISTS ] [ ONLY ]이름
[ * ]작업
[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]이름
[ * ] RENAME [ COLUMN ]칼럼이름
TO새칼럼이름
ALTER TABLE [ IF EXISTS ] [ ONLY ]이름
[ * ] RENAME CONSTRAINT제약조건이름
TO새제약조건이름
ALTER TABLE [ IF EXISTS ]이름
RENAME TO새이름
ALTER TABLE [ IF EXISTS ]이름
SET SCHEMA새스키마
ALTER TABLE ALL IN TABLESPACE이름
[ OWNED BY롤이름
[, ... ] ] SET TABLESPACE새테이블스페이스
[ NOWAIT ] ALTER TABLE [ IF EXISTS ]이름
ATTACH PARTITION파티션이름
{ FOR VALUES파티션범위명세
| DEFAULT } ALTER TABLE [ IF EXISTS ]이름
DETACH PARTITION파티션이름
작업
자리에는: ADD [ COLUMN ] [ IF NOT EXISTS ]칼럼이름
자료형
[ COLLATE문자정렬규칙
] [칼럼제약조건
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]칼럼이름
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]칼럼이름
[ SET DATA ] TYPE자료형
[ COLLATE문자정렬규칙
] [ USING표현식
] ALTER [ COLUMN ]칼럼이름
SET DEFAULT표현식
ALTER [ COLUMN ]칼럼이름
DROP DEFAULT ALTER [ COLUMN ]칼럼이름
{ SET | DROP } NOT NULL ALTER [ COLUMN ]칼럼이름
DROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ]칼럼이름
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (시퀀스옵션
) ] ALTER [ COLUMN ]칼럼이름
{ SET GENERATED { ALWAYS | BY DEFAULT } | SET시퀀스옵션
| RESTART [ [ WITH ]재시작값
] } [...] ALTER [ COLUMN ]칼럼이름
DROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]칼럼이름
SET STATISTICS정수
ALTER [ COLUMN ]칼럼이름
SET (속성옵션
=값
[, ... ] ) ALTER [ COLUMN ]칼럼이름
RESET (속성옵션
[, ... ] ) ALTER [ COLUMN ]칼럼이름
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD테이블제약조건
[ NOT VALID ] ADD인덱스를_사용하는_제약조건
ALTER CONSTRAINT제약조건이름
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] VALIDATE CONSTRAINT제약조건이름
DROP CONSTRAINT [ IF EXISTS ]제약조건이름
[ RESTRICT | CASCADE ] DISABLE TRIGGER [트리거이름
| ALL | USER ] ENABLE TRIGGER [트리거이름
| ALL | USER ] ENABLE REPLICA TRIGGER트리거이름
ENABLE ALWAYS TRIGGER트리거이름
DISABLE RULE룰이름
ENABLE RULE룰이름
ENABLE REPLICA RULE룰이름
ENABLE ALWAYS RULE룰이름
DISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ON인덱스이름
SET WITHOUT CLUSTER SET WITHOUT OIDS SET TABLESPACE새테이블스페이스
SET { LOGGED | UNLOGGED } SET (저장_매개변수
[=값
] [, ... ] ) RESET (저장_매개변수
[, ... ] ) INHERIT상위테이블
NO INHERIT상위테이블
OF자료형이름
NOT OF OWNER TO {새소유주
| CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEX인덱스이름
| FULL | NOTHING } andpartition_bound_spec
is: IN (partition_bound_expr
[, ...] ) | FROM ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal
, REMAINDERnumeric_literal
) andcolumn_constraint
is: [ CONSTRAINTconstraint_name
] { NOT NULL | NULL | CHECK (expression
) [ NO INHERIT ] | DEFAULTdefault_expr
| GENERATED ALWAYS AS (generation_expr
) STORED | GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (sequence_options
) ] | UNIQUEindex_parameters
| PRIMARY KEYindex_parameters
| REFERENCESreftable
[ (refcolumn
) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action
] [ ON UPDATEreferential_action
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] andtable_constraint
is: [ CONSTRAINTconstraint_name
] { CHECK (expression
) [ NO INHERIT ] | UNIQUE (column_name
[, ... ] )index_parameters
| PRIMARY KEY (column_name
[, ... ] )index_parameters
| EXCLUDE [ USINGindex_method
] (exclude_element
WITHoperator
[, ... ] )index_parameters
[ WHERE (predicate
) ] | FOREIGN KEY (column_name
[, ... ] ) REFERENCESreftable
[ (refcolumn
[, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETEreferential_action
] [ ON UPDATEreferential_action
] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]인덱스를_사용하는_제약조건
자리에는: [ CONSTRAINT제약조건이름
] { UNIQUE | PRIMARY KEY } USING INDEX인덱스이름
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]index_parameters
inUNIQUE
,PRIMARY KEY
, andEXCLUDE
constraints are: [ INCLUDE (column_name
[, ... ] ) ] [ WITH (storage_parameter
[=value
] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace_name
]exclude_element
in anEXCLUDE
constraint is: {column_name
| (expression
) } [opclass
] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
ALTER TABLE
명령은 테이블 정의를 바꾼다.
여러 구문이 있으며, 아래에서 설명한다. 이 명령을 실행하면,
그 작업 성격에 맞는 수준의 잠금이 일어난다는 것을 꼭 기억해야 한다.
이 잠금에 대해서 특별히 언급하지 않으면, 대부분 작업은
ACCESS EXCLUSIVE
수준으로 테이블을 잠근다.
(다른 세션에서는 해당 테이블을 접근 조차 못한다 - 옮긴이)
여러 작업들을 함께 작업하도록 명령을 구성하면,
그 하위 작업들 가운데, 가장 엄격한 수준의 잠금을 사용한다.
ADD COLUMN [ IF NOT EXISTS ]
해당 테이블에 새 칼럼을 추가하는 구문이다. 문법은
CREATE TABLE 명령에서 사용하는 것과 같다.
IF NOT EXISTS
옵션을 사용하면,
이미 같은 이름의 칼럼이 있어도 오류로 처리하지 않고, 무시한다.
DROP COLUMN [ IF EXISTS ]
해당 테이블에서 지정한 칼럼을 지우는 구문이다. 그 칼럼과
관련된 인덱스와 테이블 제약 조건은 자동으로 함께 지워진다.
해당 칼럼만 대상으로 수집된 각종 통계 정보들도 함께 지워진다.
CASCADE
옵션을 사용하면, 뷰나 그 칼럼을 참조 하는
참조키 같이 해당 칼럼을 사용하는 모든 개체들을 함께 지운다.
IF EXISTS
옵션을 사용하면, 해당 칼럼이
없어도 오류로 처리하지 않고 알림 메시지만 보여주고, 무시한다.
SET DATA TYPE
지정한 칼럼의 자료형을 바꾸는 구문이다. 이 작업은 해당 칼럼과 관계된
인덱스나 단순 테이블 제약 조건들을 새 자료형에 맞게
기존 속성을 다시 분석해서 자동으로 변환한다.
COLLATE
옵션은 새 자료형에서 사용할
문자 정렬 규칙을 지정한다. 생략하면, 그 해당 자료형의 기본
문자 정렬 규칙을 사용한다.
USING
옵션으로 옛 자료형에 맞게 저장된
자료를 새 자료형에 맞게 어떻게 변환할 것인지를 지정하는
표현식을 사용할 수 있다. 생락하면, 기본 형 변환 작업을 한다.
기본 형 변환을 못하는 경우는 반드시 이 옵션을 사용해야 한다.
SET
/DROP DEFAULT
칼럼 기본값을 지정하거나 지운다 (지우는 것은 기본값을 NULL로 지정
하는 것과 같다). 새 기본값은 지정된 다음부터
실행되는 INSERT
, UPDATE
작업에 반영된다; 기존 자료에 대해서는 바꾸지 않는다.
SET
/DROP NOT NULL
해당 칼럼의 null 값 처리 방식을 바꾼다. 이 작업은 실재 자료 유효성 검사를 한다.
SET NOT NULL
may only be applied to a column
provided none of the records in the table contain a
NULL
value for the column. Ordinarily this is
checked during the ALTER TABLE
by scanning the
entire table; however, if a valid CHECK
constraint is
found which proves no NULL
can exist, then the
table scan is skipped.
테이블이 파티션 된 경우라면, 특정 하위 테이블 하나에 대해서만
DROP NOT NULL
작업을 할 수 없다.
null 값을 허용하려면, 상위 테이블 대상으로 이 작업을 해야 한다.
상위 테이블에는 NOT NULL
제약 조건이 없어도,
하위 테이블에서는 개별적으로 이 제약 조건을 추가 할 수 있다.
그래서, 상위 테이블에서는 null 값을 허용하지만,
실 자료가 저장되는 하위 테이블에서 null 값을 금지할 수 있다.
그 반대는 안된다.
DROP EXPRESSION [ IF EXISTS ]
This form turns a stored generated column into a normal base column. Existing data in the columns is retained, but future changes will no longer apply the generation expression.
If DROP EXPRESSION IF EXISTS
is specified and the
column is not a stored generated column, no error is thrown. In this
case a notice is issued instead.
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]
이 구문들은 해당 칼럼을 식별 칼럼으로 사용하거나, 식별 칼럼 속성을
지울 때 사용한다. 식별 칼럼에 대한 자세한 설명은
CREATE TABLE 명령 설명서에서 다룬다.
Like SET DEFAULT
, these forms only affect the
behavior of subsequent INSERT
and UPDATE
commands; they do not cause rows
already in the table to change.
SET DEFAULT
와 같이, 이 작업 다음부터
실행되는 INSERT
, UPDATE
작업에 반영된다; 기존 자료에 대해서는 바꾸지 않는다.
DROP IDENTITY IF EXISTS
구문은
해당 칼럼이 식별 칼럼이 아니더라도 오류로 처리하지 않고,
알림 메시지만 보여주고, 무시한다.
SET 시퀀스옵션
RESTART
이 구문은 해당 식별 칼럼과 관계된 시퀀스 설정을 바꾼다.
시퀀스옵션
은
INCREMENT BY
와 같은
ALTER SEQUENCE 명령 설명서에서 소개하고 있는
옵션들이다.
SET STATISTICS
이 구문은 해당 칼럼에 대해서 ANALYZE 작업에서 사용하는 통계 수집량을 지정한다. 여기서 지정하는 값은 0부터 10000까지다. -1로 지정하면, 시스템 기본 값(default_statistics_target)을 사용한다. 쿼리 실행 계획기가 사용하는 이 통계 정보에 대한 자세한 이야기는 14.2절에서 다룬다.
SET STATISTICS
작업은
SHARE UPDATE EXCLUSIVE
수준의 잠금을 사용한다.
SET ( 속성옵션
= 값
[, ... ] )
RESET ( 속성옵션
[, ... ] )
(이 부분은 저보다 더 잘 아는 분이 도와주시길...)
This form sets or resets per-attribute options. Currently, the only
defined per-attribute options are n_distinct
and
n_distinct_inherited
, which override the
number-of-distinct-values estimates made by subsequent
ANALYZE
operations. n_distinct
affects the statistics for the table
itself, while n_distinct_inherited
affects the statistics
gathered for the table plus its inheritance children. When set to a
positive value, ANALYZE
will assume that the column contains
exactly the specified number of distinct nonnull values. When set to a
negative value, which must be greater
than or equal to -1, ANALYZE
will assume that the number of
distinct nonnull values in the column is linear in the size of the
table; the exact count is to be computed by multiplying the estimated
table size by the absolute value of the given number. For example,
a value of -1 implies that all values in the column are distinct, while
a value of -0.5 implies that each value appears twice on the average.
This can be useful when the size of the table changes over time, since
the multiplication by the number of rows in the table is not performed
until query planning time. Specify a value of 0 to revert to estimating
the number of distinct values normally. For more information on the use
of statistics by the PostgreSQL query
planner, refer to 14.2절.
Changing per-attribute options acquires a
SHARE UPDATE EXCLUSIVE
lock.
SET STORAGE
이 구문은 해당 칼럼 자료를 어떻게 저장할지를 정한다.
해당 자료를 테이블에 저장할지, TOAST 테이블에 저장할지,
그 자료를 압축할지 말지를 지정한다.
PLAIN
: 정수형과 같은 크기 고정, 압축 안하고,
해당 테이블에 저장한다. MAIN
: 테이블에, 압축 함.
EXTERNAL
: 토스트에, 압축 안함.
EXTENDED
: 토스트에, 압축 함.
PLAIN
으로 처리하지 않는 대부분의 자료형 자료는
EXTENDED
방식으로 저장된다.
text
형이나, bytea
형으로
아주 큰 자료인 경우, EXTERNAL
방식을 사용하면
문자열 조작 함수를 사용할 때 좀 더 빠르게 처리하며, 그 저장 공간은
커진다. SET STORAGE
작업은 이미 저장된 자료들에
대해서는 변경 작업을 하지 않는다. 이 설정 후 발생하는 자료 조작
작업에 영향을 미친다. 자세한 내용은 68.2절에서
다룬다.
ADD 테이블_제약조건
[ NOT VALID ]
이 구문은 해당 테이블에 새로운 제약 조건을 추가한다.
문법은 CREATE TABLE 명령에서 제약 조건 사용하는 것과
같다. 추가로 NOT VALID
옵션을 사용할 수 있는데,
이 옵션은 참조 키나, 체크 제약 조건인 경우 사용할 수 있다.
일반적으로, 이 작업은 새로운 제약조건에 자료가 모두 맞는지 확인하기 위해,
테이블 전체 자료를 조사한다. 하지만,
NOT VALID
옵션을 추가하면,
기존 자료에 대한 유효성 검사를 하지 않고, 이 제약 조건이 추가된
다음부터 다루는 자료에 대해서만 유효성 검사를 한다. 이렇게 하면,
참조키나, 체크 제약 조건에 대한 기존 모든 자료에 대한 유효성 검사
시간 때문에 테이블이 잠기는 것을 최소화 할 수 있다. 모든 자료에
대한 유효성 검사는 따로 VALIDATE CONSTRAINT
명령으로 할 수 있다.
NOT VALID
옵션을 사용할 때 참고해야할
보다 자세한 내용은 아래 참고에서 한다.
대부분의 ADD
작업은 테이블_제약조건
ACCESS EXCLUSIVE
모드로 테이블을 잠근다.
ADD
FOREIGN KEY
작업만 SHARE ROW
EXCLUSIVE
모드 잠금을 사용한다. 또한
ADD FOREIGN KEY
작업 시 그 참조 테이블의 자료도
같이 검사해야하기 때문에, SHARE ROW EXCLUSIVE
모드로
잠긴다.
추가로, 파티션 테이블 대상으로 유니크나 기본키 제약조건을 추가할 때는
제한사항이 있다. 이 부분은 CREATE TABLE 참고.
또한, 파티션 테이블 대상으로 참조키를 추가할 때는 현재 버전에서는
NOT VALID
옵션을 사용할 수 없다.
ADD 인덱스를_사용하는_제약조건
이 구문은 새 PRIMARY KEY
, UNIQUE
제약 조건을 추가하는데, 이미 그 용도로 쓸 인덱스가 있는 경우에
사용한다.
제약 조건 정의에 쓰일 칼럼은 그 인덱스에 쓰인 칼럼과 동일해야 한다.
여기서 사용할 인덱스는 표현식 기반도 아니며, 부분 인덱스도
아니여야 한다.
이 인덱스는 정렬이 가능한 b-tree 인덱스여야 한다. 이렇게 제한 하는
이유는 ADD PRIMARY KEY
, ADD UNIQUE
작업과 내부적으로 그 처리가 같게 하기 위해서다.
PRIMARY KEY
작업은 그 해당 칼럼들 속성이 NOT NULL
이어야 하기 때문에, 그 칼럼들이 null 값을 허용하고 있다면,
각 칼럼들에 대해서 ALTER COLUMN SET NOT NULL
작업도
함께 한다. 이런 상황이면 해당 모든 자료에 null 값이 있는지
확인하는 작업을 한다. 그 외 상황에서는 이 제약 조건에 쓸
인덱스를 만드는 작업 시간만 필요하다.
제약 조건 이름을 지정하는데, 인덱스 이름이 다르면, 인덱스 이름을 제약 조건 이름으로 자동 바꾸며, 제약 조건 이름이 없으면, 인덱스 이름을 제약 조건 이름으로 한다.
이 작업이 완료되면, 그 인덱스는 해당 제약 조건에 종속된다. 즉, 그 제약 조건이 지워지면, 그에 딸린 인덱스도 함께 지워진다.
This form is not currently supported on partitioned tables.
이미 있는 인덱스를 사용해서 제약 조건을 추가하는 방법은
테이블 잠금을 최소화 하려고 할 때 유용하게 사용된다.
해당 인덱스를 CREATE INDEX CONCURRENTLY
명령으로
테이블 잠금 없이 인덱스를 미리 만들어 두고,
그것을 이용해서 작업하기 때문에, 테이블 정의 바꾸기 작업 시간은
최소화 되어 그 만큼 잠금 시간이 짧아진다. 사용 예제는 아래에 있다.
ALTER CONSTRAINT
이 구문은 기존 제약 조건의 속성을 바꾼다. 현재 참조키 제약 조건에 대해서만 사용할 수 있다.
VALIDATE CONSTRAINT
This form validates a foreign key or check constraint that was
previously created as NOT VALID
, by scanning the
table to ensure there are no rows for which the constraint is not
satisfied. Nothing happens if the constraint is already marked valid.
(See 참고 below for an explanation
of the usefulness of this command.)
This command acquires a SHARE UPDATE EXCLUSIVE
lock.
DROP CONSTRAINT [ IF EXISTS ]
이 구문은 지정한 제약 조건을 해당 테이블에서 지운다.
그 제약 조건에 딸린 인덱스도 함께 지운다.
IF EXISTS
옵션을 사용하면, 해당 제약 조건이 없어도
오류로 처리하지 않고, 알림 메시지만 보이고, 아무 작업도 안한다.
DISABLE
/ENABLE [ REPLICA | ALWAYS ] TRIGGER
이 구문은 해당 테이블에 속한 트리거 사용 여부를 지정한다. 비활성화(disable)란 해당 트리거를 지우지는 않고, 그냥 그 트리거 실행을 안하게 하는 것을 말한다. 지연 트리거(DEFERRABLE 옵션이 있는 트리거)는 그 트리거 함수가 실재 실행 될 때가 아니라, 해당 이벤트가 생길 때 활성 상태를 확인한다. 이 작업은 각각 개별 트리거에 대해서 설정을 할 수도 있고, 해당 테이블에 속한 모든 트리거에 대해서도 설정 할 수 있고, 사용자가 지정한 트리거에 대해서만 설정할 수도 있다. (참조키 검사 같은 내부용 자동으로 만들어지는 트리거도 있는데, 이런 트리거는 제외한다는 이야기). 이런 내부 트리거의 사용 여부 설정은 슈퍼유저만 가능하다. 이런 조작은 자료 정합성을 지킬 수 없는 상태를 만들기 때문이다.
트리거 실행 조건은 session_replication_role
환경 설정 매개 변수값에도 영향을 받는다.
단순하게, 이 환경 설정 값이 “origin” 또는
“local” 일때, 활성화 된 트리거는 작동한다. (기본 설정)
해당 세션의 이 환경 설정 값이 “replica” 라면,
ENABLE REPLICA
옵션이 있는 트리거만 작동한다.
ENABLE ALWAYS
옵션이 있는 트리거는
해당 세션의 현재 복제 역활과 상관 없이 작동한다.
The effect of this mechanism is that in the default configuration,
triggers do not fire on replicas. This is useful because if a trigger
is used on the origin to propagate data between tables, then the
replication system will also replicate the propagated data, and the
trigger should not fire a second time on the replica, because that would
lead to duplication. However, if a trigger is used for another purpose
such as creating external alerts, then it might be appropriate to set it
to ENABLE ALWAYS
so that it is also fired on
replicas.
이 작업은 해당 테이블을 SHARE ROW EXCLUSIVE
수준으로
잠근다.
DISABLE
/ENABLE [ REPLICA | ALWAYS ] RULE
이 구문은 해당 테이블에 속한 룰의 실행 여부를 지정한다.
이 구문을 사용하면, 해당 룰을 지우지 않고, 단지 실행이 되지 않게
설정할 수 있다. 사용법은 트리거 사용 여부 지정하는 것과 같다.
이 작업으로도 ON SELECT
룰의 실행은 막을 수 없다.
이 룰은 현재 세션이 기본 복제 역할이 아닐지라도 뷰 작업은
항상 동작해야 하기 때문이다. (PostgreSQL의 뷰는 on select 룰이다 -
옮긴이)
DISABLE
/ENABLE ROW LEVEL SECURITY
이 구문은 해당 테이블에 속한 로우 단위 보안 정책을 활성화 하거나 비활성화 하는 일을 한다. 테이블에 해당 정책이 없는데, 활성화로 지정하면, 기본 거부 정책이 적용된다. 해당 테이블이 로우 단위 보안 정책을 사용하지 않게 설정 되어 있어도 그 테이블 용 보안 정책은 있을 수 있다. 이 경우, 그 정책은 반영이 안되며, 무시된다. CREATE POLICY 참조.
The rule firing mechanism is also affected by the configuration variable session_replication_role, analogous to triggers as described above.
NO FORCE
/FORCE ROW LEVEL SECURITY
현재 사용자가 해당 테이블의 소유주일 때 로우 단위 보안 정책을 어떻게 반영할 것인지를 지정하는 구문이다. force : 작동, no force: 비작동 (기본값) CREATE POLICY 참고.
CLUSTER ON
CLUSTER 명령에서 사용할 인덱스를 지정한다. 이 작업은 실재 클러스터 작업은 하지 않는다.
이 작업은 SHARE UPDATE EXCLUSIVE
수준으로 테이블을 잠근다.
SET WITHOUT CLUSTER
이 구문은 CLUSTER 작업을 할 때 사용하는 인덱스 지정을 지운다. 이 작업은 나중에 클러스터 작업을 할 때, 지정된 인덱스가 없기 때문에, 영향을 준다.
이 작업은 SHARE UPDATE EXCLUSIVE
수준으로 테이블을 잠근다.
SET WITHOUT OIDS
Backward-compatible syntax for removing the oid
system column. As oid
system columns cannot be
added anymore, this never has an effect.
SET TABLESPACE
이 구문은 해당 테이블의 테이블스페이스를 바꾼다.
이 작업은 해당 테이블의 물리적인 파일을 새 테이블스페이스 영역으로
옮김을 의미한다. 이 때 해당 테이블에 딸린 인덱스는 옮기지 않는다.
인덱스는 따로 해당 SET TABLESPACE
명령으로
옮길 수 있다.
When applied to a partitioned table, nothing is moved, but any
partitions created afterwards with
CREATE TABLE PARTITION OF
will use that tablespace,
unless overridden by a TABLESPACE
clause.
한 데이터베이스 내, 한 테이블스페이스 안에 있는 모든 테이블은
ALL IN TABLESPACE
구문으로 한 번에 옮긴 수있다.
이 때는 그 모든 테이블이 잠긴다. 이 구문은
OWNED BY
옵션을 이용해 특정 소유주의 모든
테이블도 한 번에 옮긴 수 있다.
NOWAIT
옵션을 사용하면,
작업 시점에 원하는 테이블 잠금을 할 수 없으면, 기다리지 않고,
오류로 처리하고 마친다.
시스템 카탈로그는 이 작업으로 모두 한꺼번에 옮길 수는
없다. 원한다면, ALTER DATABASE
명령을
이용하거나, 각 개별 테이블에 대해서 ALTER TABLE
명령을 이용해야 한다.
information_schema
안 개체들은 제외다.
CREATE TABLESPACE 참조.
SET { LOGGED | UNLOGGED }
해당 테이블의 LOGGED, UNLOGGED 설정.
(UNLOGGED
참조).
임시 테이블을 대상으로 이 작업은 할 수 없다.
SET ( 저장_매개변수
[= 값
] [, ... ] )
이 구문은 해당 테이블의 저장 매개 변수값을 바꾼다. 사용할 수 변수들은 CREATE TABLE 문서 안 스토리지 매개 변수 부분에서 자세히 다룬다. 이미 저장된 자료에 대해서 이 작업으로 그 속성이 바뀌지는 않는다. 이미 저장된 자료를 대상으로 적용하려면, VACUUM FULL 또는 CLUSTER 작업을 해야 한다. 실행 계획기와 관련된 설정 값을 바꾸는 지정은 그 작업이 완료된 다음부터 실행 계획기가 그 값을 사용한다. 실행 중인 쿼리에 대해서는 영향을 끼치지 않는다.
parallel_workers
같은 실행 계획기 관련 설정 뿐만 아니라,
fillfactor, toast, autovacuum 관련 저장 매개 변수
값을 변경할 때는
SHARE UPDATE EXCLUSIVE
수준으로 테이블을 잠근다.
RESET ( 저장_매개변수
[, ... ] )
이 구문은 해당 저장 매개 변수 값을 초기값으로 바꾼다.
SET
작업과 마찬가지로, 이렇게 지정한 뒤,
이미 있는 자료들의 소급 적용을 위해 추가 작업이 필요할 수도 있다.
INHERIT 상위테이블
이 구문은 해당 테이블을 지정한 상위 테이블에 종속시킨다.
이렇게 하면, 그 상위 테이블 대상으로 실행 되는 쿼리는
해당 테이블에 대해서도 영향을 미친다. 이 작업이 정상 수행 되려면,
상위 테이블과 하위 테이블의 모든 칼럼 정의가 일치 해야 한다(물론 하위
테이블에는 그 외 칼럼이 더 있을 수도 있다).
칼럼 자료형이 같아야 하며, 상위 테이블 칼럼에
NOT NULL
옵션이 있으면, 하위 테이블 칼럼에는
반드시 있어야 하며, 그 반대는 괜찮다.
또, CHECK
제약 조건도 같아야 한다.
상위 테이블 제약 조건 속성이 ALTER TABLE ...
ADD CONSTRAINT ... NO INHERIT
구문으로 상속을 안 하도록
되어 있다면, 서로간 제약 조건이 같지 않아도 된다.
현재 버전에서는
UNIQUE
, PRIMARY KEY
,
FOREIGN KEY
제약 조건은 검사하지 않는다.
이 특성은 다음 버전에서 바뀔 수 있다.
NO INHERIT 상위테이블
이 구문은 지정한 상위 테이블과 종속 관계를 끊는다. 이 작업을 완료 되면, 지정한 상위 테이블 관련 쿼리에서 해당 테이블을 더 이상 참조하지 않는다.
OF 자료형이름
이 구문은 CREATE TABLE OF
구문으로 이미 있는 복합 자료형을
기반으로 테이블을 만드는 것과 같이, 지정한 복한 자료형과,
해당 테이블과의 관계를 맺는다.
테이블과 복합 자료형과의 칼럼 이름, 자료형이 모두 같아야 한다.
작업 테이블은 상속 관계로 볼 때 하위 테이블이 아니여야 한다.
이런 제약은 CREATE TABLE OF
작업 결과와 같아야 하기 때문이다.
NOT OF
테이블과 자료형의 관계를 끊는다.
OWNER TO
이 구문은 테이블, 시퀀스, 뷰, 구체화한 뷰, 외부 테이블의 소유주를 바꾼다.
REPLICA IDENTITY
이 구문은 업데이트 되거나 삭제 될 식별 자료를 미리 쓰기 로그에
남길 때 포함할 정보를 바꾼다. 이 작업은 논리 복제 환경이 아니라면,
아무런 영향력이 없다.
DEFAULT
: 기본키 칼럼 옛 값을 기록.
USING INDEX
: 지정한 인덱스에 있는 해당 칼럼 옛 값을 기록.
이 인덱스는 유니크 인덱스여야 하며, 부분 인덱스가 아니며,
지연 불가능한 인덱스여야 하며, 그 칼럼은 모두 NOT NULL
속성이
있어야 한다.
FULL
: 해당 로우의 모든 칼럼 옛 값을 기록.
NOTHING
: 옛 로우에 대한 기록은 안 남김.
(시스템 테이블은 이 값이 기본값이다.)
어떤 설정을 하든, 새 버전 로우와 옛 버전 로우과 완벽하게 일치하면,
미리 쓰기 로그에는 어떠한 기록도 남기지 않는다.
RENAME
RENAME
구문은
해당 테이블(인덱스, 시퀀스, 뷰, 구체화한 뷰, 외부 테이블)의
이름을 바꾸며, 또한 해당 칼럼의 이름과, 제약 조건의 이름을 바꾼다.
제약 조건의 이름을 바꿀 때 그것과 의존 관계가 있는 인덱스가 있다면,
그 인덱스 이름도 함께 바뀐다.
이 작업은 저장된 자료에는 아무런 영향을 미치지 않는다.
SET SCHEMA
스키마 바꾸기. 해당 테이블에 딸린 인덱스, 제약 조건, 칼럼에 딸린 스키마까지 모두 스키마가 바뀐다.
ATTACH PARTITION 파티션이름
{ FOR VALUES 파티션범위명세
| DEFAULT }
해당 테이블에 하위 파티션 테이블을 추가하는 구문.
The table can be attached
as a partition for specific values using FOR VALUES
or as a default partition by using DEFAULT
.
For each index in the target table, a corresponding
one will be created in the attached table; or, if an equivalent
index already exists, will be attached to the target table's index,
as if ALTER INDEX ATTACH PARTITION
had been executed.
Note that if the existing table is a foreign table, it is currently not
allowed to attach the table as a partition of the target table if there
are UNIQUE
indexes on the target table. (See also
CREATE FOREIGN TABLE.) For each user-defined
row-level trigger that exists in the target table, a corresponding one
is created in the attached table.
파티션범위명세
구문은
CREATE TABLE 명령 설명서에 나온 것과 같음.
파티션 범위 명세는 해당 테이블(ALTER TABLE의 대상 테이블, 상위 파티션
테이블)에서 지정한 파티션 종류와 파티션 키 정의와 맞아야 함.
추가할 테이블의 칼럼과 칼럼 자료형은 상위 파티션 테이블과
정확하게 모두 일치 해야 한다. NOT NULL
,
CHECK
제약조건도 같아야 한다.
현재 버전에서는 FOREIGN KEY
제약 조건은
일치하는지 검사하지 않는다.
UNIQUE
,
PRIMARY KEY
제약 조건이 없는데, 상위 테이블에
정의 되어 있다면, 자동으로 추가되는 하위 테이블에 만들어진다.
추가할 테이블에 CHECK
제약 조건에,
NO INHERIT
옵션이 있는 경우는 허용하지 않는다.
NO INHERIT
옵션 없이 해당 제약 조건을 다시 만들어야
추가할 수 있다.
추가할 파티션 테이블이 자료가 이미 있는 일반 테이블이라면,
그 자료들이 파티션 조건에 맞는 자료인지 확인하기 위해 모든
자료의 유효성 검사를 한다. 이 작업은 자료가 많은 경우
시간이 오래 걸린다. 이 문제를 피하려면, 먼저 그 테이블에
파티션 조건에 맞는 CHECK
제약 조건을 만든다.
이렇게 하면, 모든 자료를 대상으로 유효성 검사를 하지 않게 된다.
하지만, 파티션 키가 표현식이거나, 그 칼럼이,
NOT NULL
속성이라면, 전체 자료 유효성 검사를
한다. NULL
값을 허용하지 않는 목록 파티션을
추가하는 경우에는 해당 파티션 키 칼럼에 NOT NULL
제약 조건을 추가 해야 한다.
If the new partition is a regular table, a full table scan is performed
to check that existing rows in the table do not violate the partition
constraint. It is possible to avoid this scan by adding a valid
CHECK
constraint to the table that allows only
rows satisfying the desired partition constraint before running this
command. The CHECK
constraint will be used to
determine that the table need not be scanned to validate the partition
constraint. This does not work, however, if any of the partition keys
is an expression and the partition does not accept
NULL
values. If attaching a list partition that will
not accept NULL
values, also add
NOT NULL
constraint to the partition key column,
unless it's an expression.
추가할 하위 파티션 테이블이 외부 테이블이라면, 이런 모든 제약 조건 관련 검사를 하지 않는다. (외부 테이블의 제약 조건 이야기는 CREATE FOREIGN TABLE 명령 설명서에서 다룬다.)
When a table has a default partition, defining a new partition changes
the partition constraint for the default partition. The default
partition can't contain any rows that would need to be moved to the new
partition, and will be scanned to verify that none are present. This
scan, like the scan of the new partition, can be avoided if an
appropriate CHECK
constraint is present. Also like
the scan of the new partition, it is always skipped when the default
partition is a foreign table.
Attaching a partition acquires a
SHARE UPDATE EXCLUSIVE
lock on the parent table,
in addition to ACCESS EXCLUSIVE
locks on the table
to be attached and on the default partition (if any).
DETACH PARTITION
파티션이름
지정한 파티션 이름의 하위 테이블을 해당 테이블과 종속 관계를 끊는다.
해당 테이블과 아무런 관계가 없게 된다. Any triggers that
were created as clones of those in the target table are removed.
SHARE
lock is obtained on any tables that reference
this partitioned table in foreign key constraints.
RENAME
, SET SCHEMA
,
ATTACH PARTITION
, DETACH PARTITION
구문은 딱 한 작업만 할 수 있으며, 그 외 작업들은
여러 작업들을 하나의 명령으로 함께 사용할 수 있다.
예를 들어, 여러 칼럼을 추가하거나, 삭제하고, 자료형을 바꾸는 것은
하나의 명령으로 실행할 수 있다. 이런 기능은
자료량이 많은 테이블을 대상으로 작업할 때 하나의 작업으로
처리 되기 때문에, 유용하게 사용될 수 있다.
ALTER TABLE
명령은 해당 테이블 소유주가 실행 할 수 있다.
스키마나 테이블스페이스를 바꿀 때는 새 스키마나 테이블스페이스에 대해서
해당 사용자에게 CREATE
권한이 있어야 한다.
새로운 하위 테이블을 추가할 때는 그 하위 테이블도 같은 사용자 것이여어야
한다. 파티션 테이블에서 하위 파티션 테이블을 추가할 때도 마찬가지다.
소유주를 바꾸는 경우, 기존 소유주는 직간접적으로 새 소유주의
소속원이어야 하며, 새 소유주는 해당 스키마에 대해서,
CREATE
권한이 있어야 한다.
(새 소유주가 해당 테이블을 삭제 하거나, 새로 만들 수 있어야 하기 때문이다.
슈퍼유저인 경우는 이런 제약이 없다.)
자료형을 바꾸는 경우, 새 자료형에 대해서 해당 사용자는
USAGE
권한이 있어야 한다.
IF EXISTS
해당 테이블이 없어도 오류로 처리하지 않고, 알림 메시지만 보여준다.
이름
작업 대상 해당 테이블 이름(스키마 이름 포함).
이 이름 앞에 ONLY
옵션을 사용하면,
해당 테이블만 작업 대상이 되며,
ONLY
옵션이 없으면, 해당 테이블과 그 테이블의 하위
테이블까지 모두 작업 대상이 된다. 선택적으로
이 하위 테이블 모두 작업 대상이라고 명시적으로 표시하기 위해
테이블 이름 뒤에, *
문자를 추가할 수도 있다.
칼럼이름
작업 대상 칼럼 이름이나, 새로 추가할 칼럼 이름.
새칼럼이름
바뀔 칼럼의 새 이름.
새이름
바뀔 테이블의 새 이름.
자료형
새로 추가할 칼럼의 자료형이나, 기존 자료형의 바뀔 새 자료형 이름.
테이블제약조건
해당 테이블의 새 제약 조건 이름.
제약조건
새로 추가하거나 기존 제약 조건 이름.
CASCADE
해당 칼럼이 지울 때, 그 칼럼을 사용하는 다른 모든 개체(예, 그 칼럼을 참조하는 뷰)들도 함께 지운다. (5.14절 참조)
RESTRICT
해당 칼럼을 지울 때 그 칼럼을 사용하는 다른 개체들이 있으면, 해당 칼럼을 지우지 않는다. 이것이 기본값이다.
트리거이름
활성화, 비활성화할 트리거 이름.
ALL
트리거 활성화, 비활성화 설정을 할 때 대상 트리거를 내부 트리거까지 포함해서 모든 트리거로 한 번에 지정할 때 사용 한다. (내부 트리거 - 참조키에서 사용하는 트리거, 또는 지연 가능한 유니크 제약 조건, 제외 제약 조건 - 까지 대상이 되기 때문에, 이 작업을 할 때는 슈퍼유저여야 한다.)
USER
참조키나, 지연 가능한 유니크, 제외 제약 조건에서 사용하는 내부 트리거를 제외한 나머지 모든 트리거를 한꺼번에, 활성화나 비활성화 할 때 사용하는 키워드.
인덱스이름
해당 인덱스 이름.
저장_매개변수
해당 테이블의 저장 매개 변수 이름.
value
새롭게 지정할 테이블 저장 매개 변수 값. 이 값은 해당 매개 변수에 따라 숫자 일수도 있고, 문자열 일 수도 있다.
상위테이블
상속 관계를 맺거나 끊을 해당 테이블의 상위 테이블 이름.
새소유주
바뀔 해당 테이블의 새 소유주 이름.
새테이블스페이스
바뀔 해당 테이블의 새 테이블스페이스 이름.
새스키마
바뀔 해당 테이블의 새 스키마 이름.
파티션이름
추가하거나, 뺄 파티션 테이블 이름.
파티션범위명세
지정한 파티션이 어떤 범위를 대상으로 하는지 지정한다. 여기서 사용하는 문법은 CREATE TABLE 명령 설명서에서 자세히 다룬다.
COLUMN
키워드는 무시 된다. 빠져도 괜찮다.
When a column is added with ADD COLUMN
and a
non-volatile DEFAULT
is specified, the default is
evaluated at the time of the statement and the result stored in the
table's metadata. That value will be used for the column for all existing
rows. If no DEFAULT
is specified, NULL is used. In
neither case is a rewrite of the table required.
Adding a column with a volatile DEFAULT
or
changing the type of an existing column will require the entire table and
its indexes to be rewritten. As an exception, when changing the type of an
existing column, if the USING
clause does not change
the column contents and the old type is either binary coercible to the new
type or an unconstrained domain over the new type, a table rewrite is not
needed; but any indexes on the affected columns must still be rebuilt.
Table and/or index rebuilds may take a
significant amount of time for a large table; and will temporarily require
as much as double the disk space.
CHECK
또는 NOT NULL
제약 조건 추가를 할 때는
기존 자료 모두를 검사하지만, 테이블을 다시 만들 필요는 없다.
비슷하게, 새 파티션 테이블을 추가할 때도 그 파티션 조건에 맞게 자료가 잘 저장 되어 있는지 확인하는 작업을 한다.
ALTER TABLE
명령에서 여러 작업들을 함께 사용할 수 있게한
이유는 그 작업들이 연관성이 있어 하나의 작업으로 처리되어야
필요가 있기 때문이다.
Scanning a large table to verify a new foreign key or check constraint
can take a long time, and other updates to the table are locked out
until the ALTER TABLE ADD CONSTRAINT
command is
committed. The main purpose of the NOT VALID
constraint option is to reduce the impact of adding a constraint on
concurrent updates. With NOT VALID
,
the ADD CONSTRAINT
command does not scan the table
and can be committed immediately. After that, a VALIDATE
CONSTRAINT
command can be issued to verify that existing rows
satisfy the constraint. The validation step does not need to lock out
concurrent updates, since it knows that other transactions will be
enforcing the constraint for rows that they insert or update; only
pre-existing rows need to be checked. Hence, validation acquires only
a SHARE UPDATE EXCLUSIVE
lock on the table being
altered. (If the constraint is a foreign key then a ROW
SHARE
lock is also required on the table referenced by the
constraint.) In addition to improving concurrency, it can be useful to
use NOT VALID
and VALIDATE
CONSTRAINT
in cases where the table is known to contain
pre-existing violations. Once the constraint is in place, no new
violations can be inserted, and the existing problems can be corrected
at leisure until VALIDATE CONSTRAINT
finally
succeeds.
DROP COLUMN
작업은 물리적으로 해당 칼럼을
지우지 않고, SQL 작업에서 단지 해당 칼럼을 볼 수 없게만 한다.
이 작업 뒤 일어나는 자료 추가, 변경 작업에서는 해당 칼럼에 null 값을
채운다. 이렇게 해서, 칼럼 삭제는 작업 시간을 줄일 수는 있지만,
당장에 디스크 여유 공간을 확보하지는 못한다.
칼럼 삭제 작업으로 물리적으로 해당 자료가 모두 지워지길 바란다면,
ALTER TABLE
명령에서, 칼럼 삭제 작업과 함께,
기존 모든 자료들 대상으로 하는 작업을 함께 지정하면 된다.
그러면, 그 작업을 하면서 삭제된 칼럼에 대해서는 null 값으로 바꿔
처리한다.
ALTER TABLE
명령의 테이블 다시 쓰기 작업은
안전하지 않은 MVCC 작업이다.
어떤 다른 사용자가 테이블 다시 쓰기 작업 전에,
해당 테이블 스냅샷을 만들어 사용하고 있다면,
테이블 다시 쓰기 작업이 끝난 뒤에는 그 사용자는 빈 테이블을
보게 된다.
이 문제는 13.5절에서 자세히 다룬다.
SET DATA TYPE
구문에서 USING
옵션을
사용하면, 자료형 변환의 유연성 아주 높아진다. USING
뒤에 사용하는 표현식으로 얼마든지, 기존 자료에 대한
형 변환 작업을 할 수 있기 때문이다. 이 때 주의해야 할 점은
해당 칼럼의 DEFAULT
설정으로 지정한 그 기본값이
새 자료형에서는 사용할 수 없는 경우가 있다는 것이다.
이 경우는 먼저 DROP DEFAULT
작업을 먼저하고,
ALTER TYPE
작업 뒤, 새 기본값을 지정하는
SET DEFAULT
작업을 하면 된다. 이런 작업 방식은
한 칼럼과 관계된 인덱스나, 제약 조건 변경 작업에서도 사용될 수 있다.
해당 테이블이 상속 관계의 상위 테이블이라면,
그 테이블만을 대상으로 칼럼 추가, 삭제, 자료형 바꾸기를 할 수 없다.
his ensures that the descendants always
have columns matching the parent. Similarly, a CHECK
constraint cannot be renamed in the parent without also renaming it in
all descendants, so that CHECK
constraints also match
between the parent and its descendants. (That restriction does not apply
to index-based constraints, however.)
또한 상위 테이블만 참조하면 모든 하위 테이블도 함께 참조하기 때문에,
모든 하위 테이블에서 자료 유효성 검사를 하는 제약 조건이 있어야
상위 테이블에 그 유효성 검사를 추가할 수 있다.
이 모든 경우 ALTER TABLE ONLY
명령은 오류로 처리한다.
(설명이 더 어려운데, 상속 관계 테이블 대상으로 일어나는 문제들은
서버에서 아주 친절하게 적절한 메시지를 보여준다. 서버 메시지를
차근하게 읽고 작업하면 된다. - 옮긴이)
하위 테이블의 칼럼도 함께 삭제하는 DROP COLUMN
작업은 그 칼럼이 상위 테이블로부터 상속 받은 칼럼에 대해서만
함께 삭제한다.
ALTER TABLE ONLY ... DROP
COLUMN
구문인 경우는 하위 테이블의 칼럼을 삭제하지 않는다.
이 작업은 파티션 테이블인 경우는 사용할 수 없다. 파티션 테이블은
상위 테이블과 하위 테이블의 칼럼 구성이 똑같아야 하기 때문이다.
식별 칼럼에 대한 작업(ADD
GENERATED
, SET
등, DROP
IDENTITY
)과,
TRIGGER
, CLUSTER
, OWNER
,
TABLESPACE
작업은 하위 테이블에 대해서는 자동으로
함께 작업하지 않는다. 이런 작업은 오직
해당 테이블에
대해서만 작업한다.
CHECK
제약 조건인 경우, NO INHERIT
옵션을
지정하지 않았다면, 이 작업은 하위 테이블 모두 작업한다.
시스템 카탈로그 테이블의 변경은 할 수 없다.
사용 가능한 매개 변수에 대한 설명은 CREATE TABLE 명령 설명서에서 자세히 다루고 있으며, 테이블 상속에 대한 자세한 설명은 5장에서 다룬다.
테이블에 새 칼럼 추가:
ALTER TABLE distributors ADD COLUMN address varchar(30);
That will cause all existing rows in the table to be filled with null values for the new column.
To add a column with a non-null default:
ALTER TABLE measurements ADD COLUMN mtime timestamp with time zone DEFAULT now();
Existing rows will be filled with the current time as the value of the new column, and then new rows will receive the time of their insertion.
To add a column and fill it with a value different from the default to be used later:
ALTER TABLE transactions ADD COLUMN status varchar(30) DEFAULT 'old', ALTER COLUMN status SET default 'current';
Existing rows will be filled with old
, but then
the default for subsequent commands will be current
.
The effects are the same as if the two sub-commands had been issued
in separate ALTER TABLE
commands.
칼럼 삭제:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
하나의 명령으로 두 칼럼의 자료형을 동시에 바꾸는 경우:
ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100);
정수형 칼럼을 USING
옵션을 사용해서,
timestamp with time zone
자료형으로 바꾸는 경우:
ALTER TABLE foo ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';
윗 예제와 비슷한데, 이 경우는 해당 칼럼에 기본값 설정이 있어, 그것을 지우고, 자료형 바꾸고, 다시 기본값을 지정하는 것을 하나의 명령으로 작업하는 경우:
ALTER TABLE foo ALTER COLUMN foo_timestamp DROP DEFAULT, ALTER COLUMN foo_timestamp TYPE timestamp with time zone USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second', ALTER COLUMN foo_timestamp SET DEFAULT now();
칼럼 이름 바꾸기:
ALTER TABLE distributors RENAME COLUMN address TO city;
테이블 이름 바꾸기:
ALTER TABLE distributors RENAME TO suppliers;
제약 조건 이름 바꾸기:
ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;
칼럼에 NOT NULL 제약 조건 추가:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
칼럼에 NOT NULL 제약 조건 삭제:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
To add a check constraint to a table and all its children:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
하위 테이블에 상속되지 않는 제약 조건 추가:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;
(이 체크 제약 조건은 앞으로 이 테이블을 상위 테이블로 상속 받는 새 하위 테이블이 만들어져도 이 제약 조건은 상속 받지 않는다.)
해당 테이블 및 하위 테이블 모두 해당 체크 제약 조건 삭제:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
해당 테이블만 체크 제약 조건 삭제:
ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
(이 경우는 하위 테이블에는 그 제약 조건이 그대로 남아 있게 된다.)
참조키 추가:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);
참조키를 유효성 검사 없이 추가 하고, 그 작업 뒤 유효성 검사를 하는 경우:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID; ALTER TABLE distributors VALIDATE CONSTRAINT distfk;
다중 칼럼 유니크 제약 조건 추가 (이 작업 동안 테이블은 잠긴다 - 옮긴이):
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
기본키가 없는 테이블에 기본키 제약조건 이름은 임의로 지정하고, 그 키용 인덱스를 만드는 경우 (이 작업 동안 테이블은 잠긴다 - 옮긴이):
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
테이블스페이스 바꾸기:
ALTER TABLE distributors SET TABLESPACE fasttablespace;
테이블 스키마 바꾸기:
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
인덱스를 만드는데, 테이블 잠금 없이 만들고, 그 인덱스를 기본키 제약조건을 새로 지정하는 작업:
CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id); ALTER TABLE distributors DROP CONSTRAINT distributors_pkey, ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;
범위 파티션된 테이블에 하위 파티션 테이블을 끼워넣기:
ALTER TABLE measurement ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
목록 파티션된 테이블에 하위 파티션 테이블을 끼워넣기:
ALTER TABLE cities ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
To attach a partition to a hash-partitioned table:
ALTER TABLE orders ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);
To attach a default partition to a partitioned table:
ALTER TABLE cities ATTACH PARTITION cities_partdef DEFAULT;
파티션된 테이블에서 하위 파티션 테이블을 떼어놓기:
ALTER TABLE measurement DETACH PARTITION measurement_y2015m12;
ADD
(USING INDEX
빼고),
DROP [COLUMN]
, DROP IDENTITY
, RESTART
,
SET DEFAULT
, SET DATA TYPE
(USING
빼고),
SET GENERATED
, SET
이런 구문은 표준 SQL을 따른다. 나머지 구문은
PostgreSQL 확장 기능이다.
또한, 한 번의 명령으로 여러 작업을 동시에 하는 것도 확장 기능이다.
시퀀스옵션
ALTER TABLE DROP COLUMN
명령은 해당 테이블에
모든 칼럼이 없을 때까지도 사용할 수 있다. 이 특성은 확장 기능이다.
표준에서는 칼럼이 없는 테이블을 허용하지 않는다.