ALTER TABLE <refpurpose>change the definition of a table</refpurpose> — テーブル定義を変更する
ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ]action
[, ... ] ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME CONSTRAINTconstraint_name
TOnew_constraint_name
ALTER TABLE [ IF EXISTS ]name
RENAME TOnew_name
ALTER TABLE [ IF EXISTS ]name
SET SCHEMAnew_schema
ALTER TABLE ALL IN TABLESPACEname
[ OWNED BYrole_name
[, ... ] ] SET TABLESPACEnew_tablespace
[ NOWAIT ] ALTER TABLE [ IF EXISTS ]name
ATTACH PARTITIONpartition_name
{ FOR VALUESpartition_bound_spec
| DEFAULT } ALTER TABLE [ IF EXISTS ]name
DETACH PARTITIONpartition_name
[ CONCURRENTLY | FINALIZE ] <phrase>where <replaceable class="parameter">action</replaceable> is one of:</phrase> ここで、action
は以下のいずれかです。 ADD [ COLUMN ] [ IF NOT EXISTS ]column_name
data_type
[ COLLATEcollation
] [column_constraint
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] [ USINGexpression
] ALTER [ COLUMN ]column_name
SET DEFAULTexpression
ALTER [ COLUMN ]column_name
DROP DEFAULT ALTER [ COLUMN ]column_name
{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_name
SET EXPRESSION AS (expression
) ALTER [ COLUMN ]column_name
DROP EXPRESSION [ IF EXISTS ] ALTER [ COLUMN ]column_name
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ (sequence_options
) ] ALTER [ COLUMN ]column_name
{ SET GENERATED { ALWAYS | BY DEFAULT } | SETsequence_option
| RESTART [ [ WITH ]restart
] } [...] ALTER [ COLUMN ]column_name
DROP IDENTITY [ IF EXISTS ] ALTER [ COLUMN ]column_name
SET STATISTICS {integer
| DEFAULT } ALTER [ COLUMN ]column_name
SET (attribute_option
=value
[, ... ] ) ALTER [ COLUMN ]column_name
RESET (attribute_option
[, ... ] ) ALTER [ COLUMN ]column_name
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT } ALTER [ COLUMN ]column_name
SET COMPRESSIONcompression_method
ADDtable_constraint
[ NOT VALID ] ADDtable_constraint_using_index
ALTER CONSTRAINTconstraint_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] VALIDATE CONSTRAINTconstraint_name
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_name
ENABLE ALWAYS TRIGGERtrigger_name
DISABLE RULErewrite_rule_name
ENABLE RULErewrite_rule_name
ENABLE REPLICA RULErewrite_rule_name
ENABLE ALWAYS RULErewrite_rule_name
DISABLE ROW LEVEL SECURITY ENABLE ROW LEVEL SECURITY FORCE ROW LEVEL SECURITY NO FORCE ROW LEVEL SECURITY CLUSTER ONindex_name
SET WITHOUT CLUSTER SET WITHOUT OIDS SET ACCESS METHOD {new_access_method
| DEFAULT } SET TABLESPACEnew_tablespace
SET { LOGGED | UNLOGGED } SET (storage_parameter
[=value
] [, ... ] ) RESET (storage_parameter
[, ... ] ) INHERITparent_table
NO INHERITparent_table
OFtype_name
NOT OF OWNER TO {new_owner
| CURRENT_ROLE | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEXindex_name
| FULL | NOTHING } <phrase>and <replaceable class="parameter">partition_bound_spec</replaceable> is:</phrase> また、partition_bound_spec
は以下のいずれかです。 IN (partition_bound_expr
[, ...] ) | FROM ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) TO ( {partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) | WITH ( MODULUSnumeric_literal
, REMAINDERnumeric_literal
) <phrase>and <replaceable class="parameter">column_constraint</replaceable> is:</phrase> また、column_constraint
は以下の通りです。 [ 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
) ] | UNIQUE [ NULLS [ NOT ] DISTINCT ]index_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 ] <phrase>and <replaceable class="parameter">table_constraint</replaceable> is:</phrase> また、table_constraint
は以下の通りです。 [ CONSTRAINTconstraint_name
] { CHECK (expression
) [ NO INHERIT ] | UNIQUE [ NULLS [ NOT ] DISTINCT ] (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 ] <phrase>and <replaceable class="parameter">table_constraint_using_index</replaceable> is:</phrase> またtable_constraint_using_index
は以下の通りです。 [ CONSTRAINTconstraint_name
] { UNIQUE | PRIMARY KEY } USING INDEXindex_name
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] <phrase><replaceable class="parameter">index_parameters</replaceable> in <literal>UNIQUE</literal>, <literal>PRIMARY KEY</literal>, and <literal>EXCLUDE</literal> constraints are:</phrase>UNIQUE
、PRIMARY KEY
、および、EXCLUDE
制約でのindex_parameters
は以下の通りです。 [ INCLUDE (column_name
[, ... ] ) ] [ WITH (storage_parameter
[=value
] [, ... ] ) ] [ USING INDEX TABLESPACEtablespace_name
] <phrase><replaceable class="parameter">exclude_element</replaceable> in an <literal>EXCLUDE</literal> constraint is:</phrase>EXCLUDE
制約でのexclude_element
は以下の通りです。 {column_name
| (expression
) } [ COLLATEcollation
] [opclass
[ (opclass_parameter
=value
[, ... ] ) ] ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]referential_action
in aFOREIGN KEY
/REFERENCES
constraint is: { NO ACTION | RESTRICT | CASCADE | SET NULL [ (column_name
[, ... ] ) ] | SET DEFAULT [ (column_name
[, ... ] ) ] }
<command>ALTER TABLE</command> changes the definition of an existing table.
There are several subforms described below. Note that the lock level required
may differ for each subform. An <literal>ACCESS EXCLUSIVE</literal> lock is
acquired unless explicitly noted. When multiple subcommands are given, the
lock acquired will be the strictest one required by any subcommand.
ALTER TABLE
は既存のテーブルの定義を変更します。
以下のようにいくつかの副構文があります。
要求されるロックレベルはそれぞれの副構文によって異なることに注意してください。
特に記述がなければACCESS EXCLUSIVE
ロックを取得します。
複数のサブコマンドが使われるときは、それらのサブコマンドが要求するうち、もっとも高いレベルのロックを取得します。
ADD COLUMN [ IF NOT EXISTS ]
#
This form adds a new column to the table, using the same syntax as
<link linkend="sql-createtable"><command>CREATE TABLE</command></link>. If <literal>IF NOT EXISTS</literal>
is specified and a column already exists with this name,
no error is thrown.
この構文を使用すると、CREATE TABLE
と同じ構文を使って新しい列をテーブルに追加できます。
IF NOT EXISTS
が指定され、その名前の列が既に存在している場合は、エラーが発生しません。
DROP COLUMN [ IF EXISTS ]
#
This form drops a column from a table. Indexes and
table constraints involving the column will be automatically
dropped as well.
Multivariate statistics referencing the dropped column will also be
removed if the removal of the column would cause the statistics to
contain data for only a single column.
You will need to say <literal>CASCADE</literal> if anything outside the table
depends on the column, for example, foreign key references or views.
If <literal>IF EXISTS</literal> is specified and the column
does not exist, no error is thrown. In this case a notice
is issued instead.
この構文を使用すると、テーブルから列を削除できます。
削除する列を含んでいるインデックスおよびテーブル制約も自動的に削除されます。
削除する列を参照する多変量統計がある場合、列の削除の結果、その統計が1つの列のデータしか含まないようになるなら、それも削除されます。
また、削除する列にテーブル以外が依存(例えば、外部キー制約、ビューなど)している場合、CASCADE
を付ける必要があります。
IF EXISTS
が指定されている場合、もしその列がなかったとしてもエラーにはなりません。
この場合は代わりに注意が出力されます。
SET DATA TYPE
#
This form changes the type of a column of a table. Indexes and
simple table constraints involving the column will be automatically
converted to use the new column type by reparsing the originally
supplied expression.
The optional <literal>COLLATE</literal> clause specifies a collation
for the new column; if omitted, the collation is the default for the
new column type.
The optional <literal>USING</literal>
clause specifies how to compute the new column value from the old;
if omitted, the default conversion is the same as an assignment
cast from old data type to new. A <literal>USING</literal>
clause must be provided if there is no implicit or assignment
cast from old to new type.
この構文を使用すると、テーブルの列の型を変更できます。
その列を含むインデックスと簡単なテーブル制約は、元々与えられた式を再解析し、新しい型を使用するように自動的に変換されます。
COLLATE
句を使うと、新しい列の照合順を指定できます。
省略時の照合順は新しい列の型のデフォルトになります。
USING
句を使うと、古い列値をどのように新しい値に計算するかを指定できます。
省略された場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じになります。
古いデータ型から新しいデータ型への暗黙キャストあるいは代入キャストがない場合、USING
句を指定しなければなりません。
When this form is used, the column's statistics are removed,
so running <link linkend="sql-analyze"><command>ANALYZE</command></link>
on the table afterwards is recommended.
この形式を使用すると、列の統計情報が削除されるので、後でテーブルに対してANALYZE
を実行することをお勧めします。
SET
/DROP DEFAULT
#
These forms set or remove the default value for a column (where
removal is equivalent to setting the default value to NULL). The new
default value will only apply in subsequent <command>INSERT</command>
or <command>UPDATE</command> commands; it does not cause rows already
in the table to change.
これらの構文を使用すると、列のデフォルト値を設定または削除できます(ここで、削除はデフォルト値をNULLに設定することと等価です)。
新しいデフォルト値は、変更後に行われるINSERT
またはUPDATE
コマンドにのみ適用されます。
テーブル内の既存の行は変更されません。
SET
/DROP NOT NULL
#These forms change whether a column is marked to allow null values or to reject null values. これらの構文は、列の値としてNULL値を認めるか拒絶するかを変更します。
<literal>SET NOT NULL</literal> may only be applied to a column
provided none of the records in the table contain a
<literal>NULL</literal> value for the column. Ordinarily this is
checked during the <literal>ALTER TABLE</literal> by scanning the
entire table; however, if a valid <literal>CHECK</literal> constraint is
found which proves no <literal>NULL</literal> can exist, then the
table scan is skipped.
SET NOT NULL
は、テーブルの項目でその列がNULL
値であるものが1つもない場合にのみ、その列に設定可能です。
通常これはALTER TABLE
がテーブル全体をスキャンする際に確認されます。しかしながら、NULL
が存在できないことを示す有効なCHECK
制約が見つかれば、テーブルスキャンは省略されます。
If this table is a partition, one cannot perform <literal>DROP NOT NULL</literal>
on a column if it is marked <literal>NOT NULL</literal> in the parent
table. To drop the <literal>NOT NULL</literal> constraint from all the
partitions, perform <literal>DROP NOT NULL</literal> on the parent
table. Even if there is no <literal>NOT NULL</literal> constraint on the
parent, such a constraint can still be added to individual partitions,
if desired; that is, the children can disallow nulls even if the parent
allows them, but not the other way around.
このテーブルがパーティションの場合、親テーブルでNOT NULL
の印がつけられている列についてDROP NOT NULL
を実行することはできません。
すべてのパーティションからNOT NULL
制約を削除するには、親テーブルでDROP NOT NULL
を実行してください。
親テーブルにNOT NULL
制約がない場合でも、望むなら各パーティションにそのような制約を追加することができます。
つまり、親テーブルがNULLを許していても子テーブルでNULLを禁止することができますが、その逆はできません。
SET EXPRESSION AS
#This form replaces the expression of a generated column. Existing data in the column is rewritten and all the future changes will apply the new generation expression. 《機械翻訳》このフォームは、生成された列の式を置き換えます。 列内の既存のデータは書き換えられ、将来の変更はすべて新しい生成式に適用されます。
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 <literal>DROP EXPRESSION IF EXISTS</literal> is specified and the
column is not a stored generated column, no error is thrown. In this
case a notice is issued instead.
DROP EXPRESSION IF EXISTS
が指定され、その列が格納された生成列でない場合は、エラーを発生させません。
この場合、注意メッセージが発行されます。
ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]
#
These forms change whether a column is an identity column or change the
generation attribute of an existing identity column.
See <link linkend="sql-createtable"><command>CREATE TABLE</command></link> for details.
Like <literal>SET DEFAULT</literal>, these forms only affect the
behavior of subsequent <command>INSERT</command>
and <command>UPDATE</command> commands; they do not cause rows
already in the table to change.
この構文では、列がIDENTITY列であるかどうか、または既存のIDENTITY列の生成属性を変更することができます。
詳細はCREATE TABLE
を参照してください。
SET DEFAULT
同様に、この構文は、変更後に行われるINSERT
またはUPDATE
コマンドにのみ適用されます。
テーブル内の既存の行は変更されません。
If <literal>DROP IDENTITY IF EXISTS</literal> is specified and the
column is not an identity column, no error is thrown. In this case a
notice is issued instead.
DROP IDENTITY IF EXISTS
が指定され、その列がIDENTITY列でない場合は、エラーを発生させません。
この場合、注意メッセージが発行されます。
SET sequence_option
RESTART
#
These forms alter the sequence that underlies an existing identity
column. <replaceable>sequence_option</replaceable> is an option
supported by <link linkend="sql-altersequence"><command>ALTER SEQUENCE</command></link> such
as <literal>INCREMENT BY</literal>.
この構文では、既存のIDENTITY列に紐付けられているシーケンスを変更します。
sequence_option
はINCREMENT BY
などALTER SEQUENCE
がサポートするオプションです。
SET STATISTICS
#
This form
sets the per-column statistics-gathering target for subsequent
<link linkend="sql-analyze"><command>ANALYZE</command></link> operations.
The target can be set in the range 0 to 10000. Set it
to <literal>DEFAULT</literal> to revert to using the system default
statistics target (<xref linkend="guc-default-statistics-target"/>).
(Setting to a value of -1 is an obsolete way spelling to get the same
outcome.)
For more information on the use of statistics by the
<productname>PostgreSQL</productname> query planner, refer to
<xref linkend="planner-stats"/>.
《マッチ度[73.451327]》この構文は、以後のANALYZE
操作において、列単位での統計情報収集対象を設定します。
対象として、0から10000までの範囲の値を設定可能です。
また、対象を-1に設定すると、システムのデフォルト統計情報対象(default_statistics_target)が使用されます。
PostgreSQLの問い合わせプランナによる統計情報の使用に関する詳細は、14.2を参照してください。
《機械翻訳》この形式は、後続のANALYZE
操作のための列単位の統計収集ターゲットを設定します。
ターゲットは0から10000の範囲で設定できます。
システムのデフォルトの統計ターゲット(default_statistics_target)を使用するように戻すにはDEFAULT
に設定します。
(値を -1 に設定する方法は、同じ結果を得るための古い方法です。)
PostgreSQL問い合わせプランナによる統計の使用についての詳細は14.2を参照してください。
<literal>SET STATISTICS</literal> acquires a
<literal>SHARE UPDATE EXCLUSIVE</literal> lock.
SET STATISTICS
はSHARE UPDATE EXCLUSIVE
ロックを取得します。
SET ( attribute_option
= value
[, ... ] )
RESET ( attribute_option
[, ... ] )
#
This form sets or resets per-attribute options. Currently, the only
defined per-attribute options are <literal>n_distinct</literal> and
<literal>n_distinct_inherited</literal>, which override the
number-of-distinct-values estimates made by subsequent
<link linkend="sql-analyze"><command>ANALYZE</command></link>
operations. <literal>n_distinct</literal> affects the statistics for the table
itself, while <literal>n_distinct_inherited</literal> affects the statistics
gathered for the table plus its inheritance children. When set to a
positive value, <command>ANALYZE</command> 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, <command>ANALYZE</command> 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 <productname>PostgreSQL</productname> query
planner, refer to <xref linkend="planner-stats"/>.
この構文は属性単位のオプションの設定または設定解除を行います。
現時点では属性単位のオプションで定義されているのはn_distinct
およびn_distinct_inherited
のみです。
これらのオプションは、その後のANALYZE
操作により生成される個別値数の推定値を上書きします。
n_distinct
はテーブル自身の統計情報に影響を与え、n_distinct_inherited
はテーブルとそれを継承した子テーブルから集めた統計情報に影響を与えます。
正の値の場合、ANALYZE
は、その列には、正確に指定された個数の非NULLの個別値が存在するものとみなします。
負の値の場合、この値は-1以上でなければなりませんが、ANALYZE
は、その列内の非NULLの個別値はテーブルのサイズに線形であるとみなし、推定テーブルサイズに指定した値の絶対値を乗じた値が個別値数であるとみなします。
たとえば、-1という値は、列内のすべての値に重複がないことを意味し、-0.5という値は個々の値は平均して2回現れることを意味します。
テーブルの行数との乗算は問い合わせ計画を作成するまで行われませんので、テーブルサイズが変わり続けるような場合にこれは有用かもしれません。
0という値を指定することで、個別値数の推定を通常に戻します。
PostgreSQL問い合わせプランナにおける統計情報の使用に関しては14.2を参照してください。
Changing per-attribute options acquires a
<literal>SHARE UPDATE EXCLUSIVE</literal> lock.
属性単位のオプションの変更はSHARE UPDATE EXCLUSIVE
ロックを取得します。
SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
#
This form sets the storage mode for a column. This controls whether this
column is held inline or in a secondary <acronym>TOAST</acronym> table,
and whether the data
should be compressed or not. <literal>PLAIN</literal> must be used
for fixed-length values such as <type>integer</type> and is
inline, uncompressed. <literal>MAIN</literal> is for inline,
compressible data. <literal>EXTERNAL</literal> is for external,
uncompressed data, and <literal>EXTENDED</literal> is for external,
compressed data.
Writing <literal>DEFAULT</literal> sets the storage mode to the default
mode for the column's data type. <literal>EXTENDED</literal> is the
default for most data types that support non-<literal>PLAIN</literal>
storage.
Use of <literal>EXTERNAL</literal> will make substring operations on
very large <type>text</type> and <type>bytea</type> values run faster,
at the penalty of increased storage space.
Note that <literal>ALTER TABLE ... SET STORAGE</literal> doesn't itself
change anything in the table; it just sets the strategy to be pursued
during future table updates.
See <xref linkend="storage-toast"/> for more information.
この構文は、列の格納モードを設定します。
列をインラインで保持するか補助TOASTテーブルに保持するか、また、データを圧縮するかどうかを制御できます。
PLAIN
は、integer
のような固定長の値に対して使用します。インラインで保持され、圧縮されません。
MAIN
は、インラインで保持されていて、圧縮可能なデータに使用します。
EXTERNAL
は圧縮されていない外部データに使用します。
EXTENDED
は圧縮された外部データに使用します。
DEFAULT
と書くと、列のデータ型に対して格納モードをデフォルトのモードに設定します。
EXTENDED
は、PLAIN
以外の保管をサポートするほとんどのデータ型におけるデフォルトです。
EXTERNAL
を使用すると、非常に長いtext
およびbytea
列に対する部分文字列操作の処理速度が向上しますが、必要な保管容量が増えるというデメリットがあります。
ALTER TABLE ... SET STORAGE
自体はテーブルをまったく変更しないことに注意してください。
以後のテーブルの更新時に遂行する戦略を設定するだけです。
詳細は65.2を参照してください。
SET COMPRESSION compression_method
#
This form sets the compression method for a column, determining how
values inserted in future will be compressed (if the storage mode
permits compression at all).
This does not cause the table to be rewritten, so existing data may still
be compressed with other compression methods. If the table is restored
with <application>pg_restore</application>, then all values are rewritten
with the configured compression method.
However, when data is inserted from another relation (for example,
by <command>INSERT ... SELECT</command>), values from the source table are
not necessarily detoasted, so any previously compressed data may retain
its existing compression method, rather than being recompressed with the
compression method of the target column.
The supported compression
methods are <literal>pglz</literal> and <literal>lz4</literal>.
(<literal>lz4</literal> is available only if <option>--with-lz4</option>
was used when building <productname>PostgreSQL</productname>.) In
addition, <replaceable class="parameter">compression_method</replaceable>
can be <literal>default</literal>, which selects the default behavior of
consulting the <xref linkend="guc-default-toast-compression"/> setting
at the time of data insertion to determine the method to use.
この構文を使用すると、列の圧縮方式を設定し、将来挿入される値がどのように圧縮されるかを決定できます(格納モードで圧縮が許可されている場合)。
これによってテーブルが書き換えられることはないため、既存のデータは他の圧縮方式で圧縮されたままの可能性があります。
テーブルをpg_restoreでリストアした場合、すべての値は設定された圧縮方式で書き直されます。
しかし、データが別のリレーションから挿入された場合(例えばINSERT ... SELECT
によって)、ソーステーブルからの値は必ずしも非TOAST化されるとは限らないため、以前に圧縮されたデータは、ターゲット列の圧縮方式で再圧縮されるのではなく、既存の圧縮方式を保持する場合があります。
サポートされている圧縮方式は、pglz
とlz4
です(lz4
は、PostgreSQLのビルド時に--with-lz4
が使用された場合にのみ使用できます)。
さらに、compression_method
をdefault
にすることができ、これにより、データ挿入時にdefault_toast_compression設定を参照して、使用する方法を決定するデフォルトの動作が選択されます。
ADD table_constraint
[ NOT VALID ]
#
This form adds a new constraint to a table using the same constraint
syntax as <link linkend="sql-createtable"><command>CREATE TABLE</command></link>, plus the option <literal>NOT
VALID</literal>, which is currently only allowed for foreign key
and CHECK constraints.
この構文は、CREATE TABLE
と同じ制約構文に加え、現時点では外部キー制約と検査制約でのみ許されるNOT VALID
オプションを使って新しい制約をテーブルに追加します。
Normally, this form will cause a scan of the table to verify that all
existing rows in the table satisfy the new constraint. But if
the <literal>NOT VALID</literal> option is used, this
potentially-lengthy scan is skipped. The constraint will still be
enforced against subsequent inserts or updates (that is, they'll fail
unless there is a matching row in the referenced table, in the case
of foreign keys, or they'll fail unless the new row matches the
specified check condition). But the
database will not assume that the constraint holds for all rows in
the table, until it is validated by using the <literal>VALIDATE
CONSTRAINT</literal> option.
See <xref linkend="sql-altertable-notes"/> below for more information
about using the <literal>NOT VALID</literal> option.
通常この構文は、テーブルの既存の行が新しい制約を満たすか確認するため、テーブルのスキャンの原因となります。
しかし、NOT VALID
オプションが使われていれば、時間がかかるかもしれないこのスキャンは省略されます。
それでも、制約はその後の挿入や更新に対して強制されます(つまり、外部キー制約の場合、被参照テーブルに一致する行が存在しない限り失敗します。指定された検査制約に一致する新しい行が存在しない限り失敗します)。
しかしデータベースは、VALIDATE CONSTRAINT
オプションを使用して検証されるまで、テーブル内のすべての行で制約が保持されているとみなしません。
NOT VALID
オプションを使うことに関する更なる情報は注釈以下を参照してください。
Although most forms of <literal>ADD
<replaceable class="parameter">table_constraint</replaceable></literal>
require an <literal>ACCESS EXCLUSIVE</literal> lock, <literal>ADD
FOREIGN KEY</literal> requires only a <literal>SHARE ROW
EXCLUSIVE</literal> lock. Note that <literal>ADD FOREIGN KEY</literal>
also acquires a <literal>SHARE ROW EXCLUSIVE</literal> lock on the
referenced table, in addition to the lock on the table on which the
constraint is declared.
ADD
のほとんどの構文ではtable_constraint
ACCESS EXCLUSIVE
ロックが必要ですが、ADD FOREIGN KEY
ではSHARE ROW EXCLUSIVE
ロックだけが必要です。
ADD FOREIGN KEY
は、制約を宣言したテーブルでのロックに加えて、被参照テーブルのSHARE ROW EXCLUSIVE
ロックも取得することに注意してください。
Additional restrictions apply when unique or primary key constraints
are added to partitioned tables; see <link linkend="sql-createtable"><command>CREATE TABLE</command></link>.
Also, foreign key constraints on partitioned
tables may not be declared <literal>NOT VALID</literal> at present.
一意性制約や主キー制約がパーティションテーブルに追加されるときには、追加的な制限が適用されます。
CREATE TABLE
を参照してください。
また、今のところ、パーティションテーブルでの外部キー制約ではNOT VALID
と宣言できません。
ADD table_constraint_using_index
#
This form adds a new <literal>PRIMARY KEY</literal> or <literal>UNIQUE</literal>
constraint to a table based on an existing unique index. All the
columns of the index will be included in the constraint.
この構文は、既存の一意性インデックスに基づき、テーブルにPRIMARY KEY
またはUNIQUE
制約を新たに追加します。
インデックスのすべての列がこの制約に含まれます。
The index cannot have expression columns nor be a partial index.
Also, it must be a b-tree index with default sort ordering. These
restrictions ensure that the index is equivalent to one that would be
built by a regular <literal>ADD PRIMARY KEY</literal> or <literal>ADD UNIQUE</literal>
command.
このインデックスは式列を持つことはできず、また部分インデックスであってはいけません。
またこれはデフォルトのソート順序を持つB-Treeインデックスでなければなりません。
これらの制限により、このインデックスが通常のADD PRIMARY KEY
またはADD UNIQUE
コマンドにより構築されたインデックスと等価であることを確実にします。
If <literal>PRIMARY KEY</literal> is specified, and the index's columns are not
already marked <literal>NOT NULL</literal>, then this command will attempt to
do <literal>ALTER COLUMN SET NOT NULL</literal> against each such column.
That requires a full table scan to verify the column(s) contain no
nulls. In all other cases, this is a fast operation.
PRIMARY KEY
が指定され、インデックスの列がNOT NULL
と印付けされていない場合、このコマンドはこうした列のそれぞれに対してALTER COLUMN SET NOT NULL
の実施を試みます。
これは列にNULLが含まれないことを検証するために完全なテーブルスキャンを必要とします。
この他の場合においては、これが高速な操作です。
If a constraint name is provided then the index will be renamed to match the constraint name. Otherwise the constraint will be named the same as the index. 制約名が提供された場合、インデックスの名前は制約名に合うように変更されます。 提供されない場合は制約にはインデックスと同じ名前が付けられます。
After this command is executed, the index is <quote>owned</quote> by the
constraint, in the same way as if the index had been built by
a regular <literal>ADD PRIMARY KEY</literal> or <literal>ADD UNIQUE</literal>
command. In particular, dropping the constraint will make the index
disappear too.
このコマンドの実行後、インデックスは、制約により「所有」され、それはインデックスが通常のADD PRIMARY KEY
またはADD UNIQUE
により構築された場合と同様です。
特にこの制約を削除するとインデックスも消えてしまいます。
This form is not currently supported on partitioned tables. この形式は今のところパーティションテーブルではサポートされません。
Adding a constraint using an existing index can be helpful in
situations where a new constraint needs to be added without blocking
table updates for a long time. To do that, create the index using
<command>CREATE UNIQUE INDEX CONCURRENTLY</command>, and then convert it to a
constraint using this syntax. See the example below.
《マッチ度[80.733945]》既存のインデックスを使用した制約の追加は、テーブル更新を長時間ブロックすることなく新しい制約を追加しなければならない場合に有用になる可能性があります。
このためには、CREATE INDEX CONCURRENTLY
を用いてインデックスを作成し、この構文を使用して正式の制約としてインストールしてください。
後述の例を参照してください。
《機械翻訳》既存のインデックスを使用して制約を追加すると、テーブル更新を長時間ブロックすることなく新しい制約を追加する必要がある場合に役立ちます。
そのためには、CREATE UNIQUE INDEX CONCURRENTLY
を使用してインデックスを作成し、次の構文を使用して制約に変換します。
以下の例を参照してください。
ALTER CONSTRAINT
#This form alters the attributes of a constraint that was previously created. Currently only foreign key constraints may be altered. この構文は以前に作成された制約の属性を変更します。 現在は外部キー制約のみを変更できます。
VALIDATE CONSTRAINT
#
This form validates a foreign key or check constraint that was
previously created as <literal>NOT VALID</literal>, 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 <xref linkend="sql-altertable-notes"/> below for an explanation
of the usefulness of this command.)
この構文は、以前にNOT VALID
として作成された外部キー制約または検査制約を、これらの制約を満たさない行が存在しないことを確認するためにテーブルをスキャンして、検証します。
制約がすでに有効であると記録されている場合は何も起こりません。
(このコマンドの有用性の説明は注釈以下を参照してください。)
This command acquires a <literal>SHARE UPDATE EXCLUSIVE</literal> lock.
このコマンドはSHARE UPDATE EXCLUSIVE
ロックを取得します。
DROP CONSTRAINT [ IF EXISTS ]
#
This form drops the specified constraint on a table, along with
any index underlying the constraint.
If <literal>IF EXISTS</literal> is specified and the constraint
does not exist, no error is thrown. In this case a notice is issued instead.
この構文はテーブル上の指定した制約を、制約の基となるインデックスと共に削除します。
IF EXISTS
が指定された場合、その制約がなくてもエラーになりません。
この場合は代わりに注意が出力されます。
DISABLE
/ENABLE [ REPLICA | ALWAYS ] TRIGGER
#These forms configure the firing of trigger(s) belonging to the table. A disabled trigger is still known to the system, but is not executed when its triggering event occurs. (For a deferred trigger, the enable status is checked when the event occurs, not when the trigger function is actually executed.) One can disable or enable a single trigger specified by name, or all triggers on the table, or only user triggers (this option excludes internally generated constraint triggers, such as those that are used to implement foreign key constraints or deferrable uniqueness and exclusion constraints). Disabling or enabling internally generated constraint triggers requires superuser privileges; it should be done with caution since of course the integrity of the constraint cannot be guaranteed if the triggers are not executed. この構文を使用すると、テーブルに属するトリガの発行について設定できます。 無効にされたトリガはシステム上に存在し続けますが、トリガイベントが発生したとしても実行されません。 (遅延トリガの場合、有効無効状態の確認は、トリガ関数を実際に実行しようとする時ではなく、イベントの発生時に行われます。) 名前でトリガを1つ指定して有効または無効にすることもできますし、テーブル上のすべてのトリガを有効または無効にすることもできます。 また、ユーザトリガのみを有効または無効にすることも可能です (このオプションは、外部キー制約、遅延可能な一意性および排他制約を実装するために使用される内部向けに生成される制約トリガを除外します。) 内部向けに生成される制約トリガを有効または無効にするにはスーパーユーザ権限が必要です。 トリガが実行されなかった場合は当然ながら制約の整合性が保証されませんので、制約トリガの無効化は注意して実行しなければなりません。
The trigger firing mechanism is also affected by the configuration
variable <xref linkend="guc-session-replication-role"/>. Simply enabled
triggers (the default) will fire when the replication role is <quote>origin</quote>
(the default) or <quote>local</quote>. Triggers configured as <literal>ENABLE
REPLICA</literal> will only fire if the session is in <quote>replica</quote>
mode, and triggers configured as <literal>ENABLE ALWAYS</literal> will
fire regardless of the current replication role.
トリガ発行機構は設定変数session_replication_roleの影響も受けます。
単に有効としたトリガ(デフォルト)では、レプリケーションロールが「origin」(デフォルト)または「local」の場合に発行されます。
ENABLE REPLICA
と設定されたトリガでは、セッションが「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; so 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 <literal>ENABLE ALWAYS</literal> so that it is also fired on
replicas.
この仕組みの効果はデフォルト設定ではレプリカ上でトリガが発行しないことです。
トリガがオリジンでテーブル間でデータを伝播するのに使われている場合にレプリケーションシステムは伝播したデータもレプリケーションします。レプリカ上でトリガが再度発動すべきではありませんので、これは有用です。
しかしながら、トリガが外部的な警告を発するなどの他の意図で使われている場合、レプリカでもトリガが発行されるようにENABLE ALWAYS
を設定するのが適切と言えます。
When this command is applied to a partitioned table, the states of
corresponding clone triggers in the partitions are updated too,
unless <literal>ONLY</literal> is specified.
このコマンドがパーティション化されたテーブルに適用されると、ONLY
が指定されていない限り、パーティション内の対応するクローントリガの状態も更新されます。
This command acquires a <literal>SHARE ROW EXCLUSIVE</literal> lock.
このコマンドはSHARE ROW EXCLUSIVE
ロックを取得します。
DISABLE
/ENABLE [ REPLICA | ALWAYS ] RULE
#
These forms configure the firing of rewrite rules belonging to the table.
A disabled rule is still known to the system, but is not applied
during query rewriting. The semantics are as for disabled/enabled
triggers. This configuration is ignored for <literal>ON SELECT</literal> rules, which
are always applied in order to keep views working even if the current
session is in a non-default replication role.
この構文を使用すると、テーブルに属する書き換えルールの実行について設定することができます。
ルールは無効にしてもシステムに残りますが、問い合わせ書き換え時に適用されません。
この意味はトリガの有効化、無効化と同じです。
この設定はON SELECT
ルールでは無視されます。
現在のセッションがデフォルト以外のレプリケーションモードであったとしても、ビュー操作を維持するために常に適用されます。
The rule firing mechanism is also affected by the configuration variable <xref linkend="guc-session-replication-role"/>, analogous to triggers as described above. 前述のトリガと同様に、ルール発行機構は設定変数session_replication_roleの影響を受けます。
DISABLE
/ENABLE ROW LEVEL SECURITY
#
These forms control the application of row security policies belonging
to the table. If enabled and no policies exist for the table, then a
default-deny policy is applied. Note that policies can exist for a table
even if row-level security is disabled. In this case, the policies will
<emphasis>not</emphasis> be applied and the policies will be ignored.
See also
<link linkend="sql-createpolicy"><command>CREATE POLICY</command></link>.
これらの構文は、テーブルの行セキュリティポリシーの適用を制御します。
有効にされ、かつテーブルにポリシーが存在しない場合は、デフォルトの拒絶ポリシーが適用されます。
行単位セキュリティが無効になっている場合でも、テーブルのセキュリティが存在し得ることに注意してください。
この場合、ポリシーは適用されず、無視されます。
CREATE POLICY
も参照してください。
NO FORCE
/FORCE ROW LEVEL SECURITY
#
These forms control the application of row security policies belonging
to the table when the user is the table owner. If enabled, row-level
security policies will be applied when the user is the table owner. If
disabled (the default) then row-level security will not be applied when
the user is the table owner.
See also
<link linkend="sql-createpolicy"><command>CREATE POLICY</command></link>.
これらの構文は、ユーザがテーブルの所有者である場合について、テーブルの行セキュリティポリシーの適用を制御します。
有効の場合、ユーザがテーブルの所有者であれば、行セキュリティポリシーが適用されます。
無効(デフォルト)の場合、ユーザがテーブルの所有者であれば、行セキュリティポリシーは適用されません。
CREATE POLICY
も参照してください。
CLUSTER ON
#
This form selects the default index for future
<link linkend="sql-cluster"><command>CLUSTER</command></link>
operations. It does not actually re-cluster the table.
この構文は、以後のCLUSTER
操作用のデフォルトインデックスを選択します。
テーブルの再クラスタ化は実際には行いません。
Changing cluster options acquires a <literal>SHARE UPDATE EXCLUSIVE</literal> lock.
clusterオプションの変更はSHARE UPDATE EXCLUSIVE
ロックを取得します。
SET WITHOUT CLUSTER
#
This form removes the most recently used
<link linkend="sql-cluster"><command>CLUSTER</command></link>
index specification from the table. This affects
future cluster operations that don't specify an index.
この構文は、テーブルから、一番最後に適用されたCLUSTER
インデックス指定を削除します。
以後のインデックスを指定しないクラスタ操作に影響を及ぼします。
Changing cluster options acquires a <literal>SHARE UPDATE EXCLUSIVE</literal> lock.
clusterオプションの変更はSHARE UPDATE EXCLUSIVE
ロックを取得します。
SET WITHOUT OIDS
#
Backward-compatible syntax for removing the <literal>oid</literal>
system column. As <literal>oid</literal> system columns cannot be
added anymore, this never has an effect.
システム列oid
を削除する、後方互換のための構文です。
システム列oid
は今では追加できませんので、これは効果がありません。
SET ACCESS METHOD
#
This form changes the access method of the table by rewriting it
using the indicated access method; specifying
<literal>DEFAULT</literal> selects the access method set as the
<xref linkend="guc-default-table-access-method"/> configuration
parameter.
See <xref linkend="tableam"/> for more information.
《機械翻訳》このフォームは、指示されたアクセス方式で書き換えることにより、テーブルのアクセス方式を変更します。
DEFAULT
を指定すると、default_table_access_method設定パラメータとして設定されたアクセス方式が選択されます。
詳細については、第61章を参照してください。
When applied to a partitioned table, there is no data to rewrite,
but partitions created afterwards will default to the given access
method unless overridden by a <literal>USING</literal> clause.
Specifying <varname>DEFAULT</varname> removes a previous value,
causing future partitions to default to
<varname>default_table_access_method</varname>.
《機械翻訳》パーティションテーブルに適用すると、書き換えるデータはありませんが、後で作成されるパーティションはUSING
句で上書きされない限り、デフォルトで指定されたアクセス方式になります。
DEFAULT
を指定すると、以前の値が削除され、以降のパーティションはデフォルトでdefault_table_access_method
になります。
SET TABLESPACE
#
This form changes the table's tablespace to the specified tablespace and
moves the data file(s) associated with the table to the new tablespace.
Indexes on the table, if any, are not moved; but they can be moved
separately with additional <literal>SET TABLESPACE</literal> commands.
When applied to a partitioned table, nothing is moved, but any
partitions created afterwards with
<command>CREATE TABLE PARTITION OF</command> will use that tablespace,
unless overridden by a <literal>TABLESPACE</literal> clause.
この構文を使用すると、テーブルのテーブル空間を指定したテーブル空間に変更し、テーブルに関連するデータファイルを新しいテーブル空間に移動することができます。
テーブルにインデックスがあっても移動されません。
インデックスを移動するには、別途SET TABLESPACE
コマンドを実行します。
パーティションテーブルに適用された場合には何も移動されませんが、以後CREATE TABLE PARTITION OF
で作られるパーティションは、TABLESPACE
句により上書きされない限り、そのテーブル空間を使うようになります。
All tables in the current database in a tablespace can be moved by using
the <literal>ALL IN TABLESPACE</literal> form, which will lock all tables
to be moved first and then move each one. This form also supports
<literal>OWNED BY</literal>, which will only move tables owned by the
roles specified. If the <literal>NOWAIT</literal> option is specified
then the command will fail if it is unable to acquire all of the locks
required immediately. Note that system catalogs are not moved by this
command; use <command>ALTER DATABASE</command> or explicit
<command>ALTER TABLE</command> invocations instead if desired. The
<literal>information_schema</literal> relations are not considered part
of the system catalogs and will be moved.
See also
<link linkend="sql-createtablespace"><command>CREATE TABLESPACE</command></link>.
ALL IN TABLESPACE
構文を使うことで、テーブル空間内の現在のデータベースのすべてのテーブルを移動することができます。
この場合、移動されるすべてのテーブルがまずロックされ、それから一つずつ移動されます。
この構文はOWNED BY
もサポートしており、これを使うと、指定のロールが所有しているテーブルだけを移動します。
NOWAIT
を指定した場合、必要とするすべてのロックを即座に獲得できなければ、このコマンドは失敗します。
このコマンドではシステムカタログは移動されないことに注意し、必要なら代わりにALTER DATABASE
を使うか、あるいはALTER TABLE
で明示的に指定してください。
information_schema
のリレーションはシステムカタログとはみなされないので、移動されます。
CREATE TABLESPACE
も参照してください。
SET { LOGGED | UNLOGGED }
#
This form changes the table from unlogged to logged or vice-versa
(see <xref linkend="sql-createtable-unlogged"/>). It cannot be applied
to a temporary table.
この構文は、テーブルをログを取らないテーブルからログを取るテーブルに変更、あるいはその逆を行います(UNLOGGED
参照)。
これは一時テーブルに対して使うことはできません。
This also changes the persistence of any sequences linked to the table (for identity or serial columns). However, it is also possible to change the persistence of such sequences separately. これは、テーブルにリンクされたシーケンス(ID列またはシリアル列)の永続性も変更します。 一方、このようなシーケンスの永続性を個別に変更することもできます。
SET ( storage_parameter
[= value
] [, ... ] )
#
This form changes one or more storage parameters for the table. See
<xref linkend="sql-createtable-storage-parameters"/> in the
<link linkend="sql-createtable"><command>CREATE TABLE</command></link> documentation
for details on the available parameters. Note that the table contents
will not be modified immediately by this command; depending on the
parameter you might need to rewrite the table to get the desired effects.
That can be done with <link linkend="sql-vacuum"><command>VACUUM
FULL</command></link>, <link linkend="sql-cluster"><command>CLUSTER</command></link> or one of the forms
of <command>ALTER TABLE</command> that forces a table rewrite.
For planner related parameters, changes will take effect from the next
time the table is locked so currently executing queries will not be
affected.
この構文は、1つ以上のテーブルの格納パラメータを変更します。
設定可能なパラメータの詳細に関してはCREATE TABLE
文書の格納パラメータを参照してください。
このコマンドによってテーブルの内容が即座に変更されない点に注意してください。
パラメータによりますが、期待する効果を得るためにテーブルを書き換える必要がある場合があります。
このためには、VACUUM FULL
、CLUSTER
またはテーブルを強制的に書き換えるALTER TABLE
の構文のいずれかを使用してください。
プランナに関連するパラメータについては、次にテーブルがロックされた時に変更が有効になるため、現在実行中の問い合わせは影響を受けません。
<literal>SHARE UPDATE EXCLUSIVE</literal> lock will be taken for
fillfactor, toast and autovacuum storage parameters, as well as the
planner parameter <varname>parallel_workers</varname>.
fillfactor、TOAST、およびautovacuumのストレージパラメータおよびプランナに関連するパラメータparallel_workers
についてはSHARE UPDATE EXCLUSIVE
ロックが獲得されます。
RESET ( storage_parameter
[, ... ] )
#
This form resets one or more storage parameters to their
defaults. As with <literal>SET</literal>, a table rewrite might be
needed to update the table entirely.
この構文は、1つ以上の格納パラメータをデフォルト値に再設定します。
SET
同様、テーブル全体を更新するためにテーブルの書き換えが必要になる場合があります。
INHERIT parent_table
#
This form adds the target table as a new child of the specified parent
table. Subsequently, queries against the parent will include records
of the target table. To be added as a child, the target table must
already contain all the same columns as the parent (it could have
additional columns, too). The columns must have matching data types,
and if they have <literal>NOT NULL</literal> constraints in the parent
then they must also have <literal>NOT NULL</literal> constraints in the
child.
この構文は、対象テーブルを指定した親テーブルの子テーブルとして追加します。
その後に行われる親テーブルへの問い合わせには対象テーブルの項目も含まれます。
子テーブルとして追加するためには、対象テーブルには親テーブルと同じ列がすべて含まれていなければなりません。
(この他の列を持つこともできます。)
これらの列のデータ型は一致している必要があり、親テーブルでNOT NULL
制約がある場合は、子テーブルでも同様にNOT NULL
制約を持たなければなりません。
There must also be matching child-table constraints for all
<literal>CHECK</literal> constraints of the parent, except those
marked non-inheritable (that is, created with <literal>ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT</literal>)
in the parent, which are ignored; all child-table constraints matched
must not be marked non-inheritable.
Currently
<literal>UNIQUE</literal>, <literal>PRIMARY KEY</literal>, and
<literal>FOREIGN KEY</literal> constraints are not considered, but
this might change in the future.
また、親テーブルのCHECK
制約すべてについても、一致する制約が子テーブルに存在しなければなりません。
ただし、親テーブルにおいて継承不可と印付けされている(つまりALTER TABLE ... ADD CONSTRAINT ... NO INHERIT
付きで作成された)制約は除きます(これらは無視されます)。
一致する子テーブルの制約はすべて継承不可であってはなりません。
現時点ではUNIQUE
、PRIMARY KEY
、FOREIGN KEY
制約は無視されますが、将来変更されるかもしれません。
NO INHERIT parent_table
#This form removes the target table from the list of children of the specified parent table. Queries against the parent table will no longer include records drawn from the target table. この構文は、指定した親テーブルの子テーブル群から対象のテーブルを削除します。 親テーブルへの問い合わせでは、対象としたテーブルからのデータが含まれなくなります。
OF type_name
#
This form links the table to a composite type as though <command>CREATE
TABLE OF</command> had formed it. The table's list of column names and types
must precisely match that of the composite type. The table must
not inherit from any other table. These restrictions ensure
that <command>CREATE TABLE OF</command> would permit an equivalent table
definition.
この構文は、CREATE TABLE OF
で形成されたかのように、テーブルと複合型とを関連付けします。
テーブルの列名とその型のリストは、複合型のものと正確に一致していなければなりません。
テーブルはどのテーブルも継承していてはいけません。
これらの制限によりCREATE TABLE OF
により作成できるテーブル定義と同等になります。
NOT OF
#This form dissociates a typed table from its type. この構文は型と型付けされたテーブルの関連を取り除きます。
OWNER TO
#This form changes the owner of the table, sequence, view, materialized view, or foreign table to the specified user. この構文を使用すると、テーブル、シーケンス、ビュー、マテリアライズドビュー、または外部テーブルの所有者を、指定したユーザに変更できます。
REPLICA IDENTITY
#This form changes the information which is written to the write-ahead log to identify rows which are updated or deleted. In most cases, the old value of each column is only logged if it differs from the new value; however, if the old value is stored externally, it is always logged regardless of whether it changed. This option has no effect except when logical replication is in use. この形式は、先行書き込みログに書き込まれる情報を変更して、更新または削除された行を識別します。 ほとんどの場合、各列の古い値は、新しい値と異なる場合にのみログに記録されます。 ただし、古い値が外部に保存されている場合は、変更されたかどうかに関係なく、常にログに記録されます。 このオプションは、論理レプリケーションが使用されている場合を除いて何の効果もありません。
DEFAULT
#Records the old values of the columns of the primary key, if any. This is the default for non-system tables. 主キーの列に古い値がある場合、それを記録します。 これは、非システムテーブルのデフォルトです。
USING INDEX index_name
#
Records the old values of the columns covered by the named index,
that must be unique, not partial, not deferrable, and include only
columns marked <literal>NOT NULL</literal>. If this index is
dropped, the behavior is the same as <literal>NOTHING</literal>.
指定されたインデックスによってカバーされる列の古い値を記録します。
これは、一意であり、部分的ではなく、遅延可能でなく、NOT NULL
とマークされた列のみを含む必要があります。
このインデックスが削除された場合、動作はNOTHING
と同じです。
FULL
#Records the old values of all columns in the row. 行のすべての列の古い値を記録します。
NOTHING
#Records no information about the old row. This is the default for system tables. 古い行に関する情報は記録されません。 これは、システムテーブルのデフォルトです。
RENAME
#
The <literal>RENAME</literal> forms change the name of a table
(or an index, sequence, view, materialized view, or foreign table), the
name of an individual column in a table, or the name of a constraint of
the table. When renaming a constraint that has an underlying index,
the index is renamed as well.
There is no effect on the stored data.
RENAME
構文を使用すると、テーブル(もしくは、インデックス、シーケンス、ビュー、マテリアライズドビュー、外部テーブル)の名前、テーブルの個々の列名、テーブルの制約名を変更できます。
元となるインデックスを持つ制約名を変更するとき、インデックス名も同様に変更されます。
格納されているデータへの影響はありません。
SET SCHEMA
#This form moves the table into another schema. Associated indexes, constraints, and sequences owned by table columns are moved as well. この構文を使用して、テーブルを別のスキーマに移動することができます。 関連するインデックスや制約、テーブル列により所有されるシーケンスも同様に移動されます。
ATTACH PARTITION partition_name
{ FOR VALUES partition_bound_spec
| DEFAULT }
#
This form attaches an existing table (which might itself be partitioned)
as a partition of the target table. The table can be attached
as a partition for specific values using <literal>FOR VALUES</literal>
or as a default partition by using <literal>DEFAULT</literal>.
For each index in the target table, a corresponding
one will be created in the attached table; or, if an equivalent
index already exists, it will be attached to the target table's index,
as if <command>ALTER INDEX ATTACH PARTITION</command> 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 <literal>UNIQUE</literal> indexes on the target table. (See also
<xref linkend="sql-createforeigntable"/>.) For each user-defined
row-level trigger that exists in the target table, a corresponding one
is created in the attached table.
この構文は、既存のテーブル(それ自体がパーティションテーブルのこともあります)を対象テーブルのパーティションとして追加します。
テーブルは、FOR VALUES
を使って指定の値のパーティションとして、あるいは、DEFAULT
を使ってデフォルトパーティションとして追加できます。
対象テーブルの各インデックスについて、対応するインデックスが付加されるテーブルに作られます。
また、同等のインデックスが既にある場合には、そのインデックスが、ALTER INDEX ATTACH PARTITION
が実行された場合と同様に、対象テーブルのインデックスに付加されます。
既存のテーブルが外部テーブルの場合、今のところ対象テーブルにUNIQUE
インデックスがあるときにはテーブルを対象テーブルのパーティションとして追加することはできない点に注意してください(CREATE FOREIGN TABLEも参照してください)。
対象テーブルにある各ユーザ定義の行レベルのトリガに対しては、対応するものが付加されるテーブルに作られます。
A partition using <literal>FOR VALUES</literal> uses same syntax for
<replaceable class="parameter">partition_bound_spec</replaceable> as
<link linkend="sql-createtable"><command>CREATE TABLE</command></link>. The partition bound specification
must correspond to the partitioning strategy and partition key of the
target table. The table to be attached must have all the same columns
as the target table and no more; moreover, the column types must also
match. Also, it must have all the <literal>NOT NULL</literal> and
<literal>CHECK</literal> constraints of the target table. Currently
<literal>FOREIGN KEY</literal> constraints are not considered.
<literal>UNIQUE</literal> and <literal>PRIMARY KEY</literal> constraints
from the parent table will be created in the partition, if they don't
already exist.
If any of the <literal>CHECK</literal> constraints of the table being
attached are marked <literal>NO INHERIT</literal>, the command will fail;
such constraints must be recreated without the
<literal>NO INHERIT</literal> clause.
FOR VALUES
を使ったパーティションはpartition_bound_spec
でCREATE TABLE
と同じ構文を使います。
パーティション境界の指定は、対象テーブルのパーティション戦略とパーティションキーと対応していなければなりません。
付加されるテーブルは、対象と全て同じ列を持ち、それ以上の列は持たず、列の型も一致していなければなりません。
また、対象テーブルにある全てのNOT NULL
およびCHECK
制約を持たなければなりません。
今のところ、FOREIGN KEY
制約は考慮されません。
親テーブルのUNIQUE
およびPRIMARY KEY
制約は、既に在るのでなければ、パーティションに作られます。
もし、アタッチされるテーブルのいずれかのCHECK
制約がNO INHERIT
と印付けされていたなら、コマンドは失敗します。
このような制約はNO INHERIT
句なしに再作成しなければなりません。
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
<literal>CHECK</literal> constraint to the table that allows only
rows satisfying the desired partition constraint before running this
command. The <literal>CHECK</literal> 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
<literal>NULL</literal> values. If attaching a list partition that will
not accept <literal>NULL</literal> values, also add a
<literal>NOT NULL</literal> constraint to the partition key column,
unless it's an expression.
新しいパーティションが通常のテーブルの場合、テーブルに存在する行がパーティションの制約に違反しないことを確認するため、テーブルの全件スキャンが行われます。
このコマンドを実行するより前に、望まれるパーティションの制約を満たす行だけしか許さないような有効なCHECK
制約をテーブルに追加すれば、この全件スキャンを避けることができます。
CHECK
制約は、パーティションの制約を確認するためにテーブルをスキャンする必要がないか決めるために使われます。
しかし、パーティションキーに式が一つでもあり、パーティションがNULL
値を受け付けないときは、この仕組みは機能しません。
NULL
値を受け付けないリストパーティションに追加するときも、それが式でないなら、パーティションキーの列にNOT NULL
制約を追加してください。
If the new partition is a foreign table, nothing is done to verify that all the rows in the foreign table obey the partition constraint. (See the discussion in <xref linkend="sql-createforeigntable"/> about constraints on the foreign table.) 新しいパーティションが外部テーブルの場合、外部テーブルのすべての行がパーティションの制約に従うかどうかの確認は何も行われません。 (外部テーブルの制約については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 <literal>CHECK</literal> constraint is present. Also like
the scan of the new partition, it is always skipped when the default
partition is a foreign table.
テーブルがデフォルトパーティションを持っている場合、新たなパーティションの定義はデフォルトパーティションに対するパーティション制約を変更します。
デフォルトパーティションは新パーティションに移動すべきいかなる行を含むことができず、そのような行が無いことを確認するためスキャンが行われます。
このスキャンは、新パーティションのスキャンと同様に、適切なCHECK
制約があれば回避できます。
やはり、新パーティションのスキャンと同様に、デフォルトパーティションが外部テーブルであるときは、このスキャンは常に省略されます。
Attaching a partition acquires a
<literal>SHARE UPDATE EXCLUSIVE</literal> lock on the parent table,
in addition to the <literal>ACCESS EXCLUSIVE</literal> locks on the table
being attached and on the default partition (if any).
パーティションの追加は、追加されるテーブルと(もしあれば)デフォルトパーティションでのACCESS EXCLUSIVE
ロックに加えて、親テーブルでSHARE UPDATE EXCLUSIVE
ロックを取得します。
Further locks must also be held on all sub-partitions if the table being
attached is itself a partitioned table. Likewise if the default
partition is itself a partitioned table. The locking of the
sub-partitions can be avoided by adding a <literal>CHECK</literal>
constraint as described in
<xref linkend="ddl-partitioning-declarative-maintenance"/>.
追加されるテーブル自体がパーティションテーブルである場合は、すべてのサブパーティションでさらにロックを保持する必要があります。
デフォルトパーティション自体がパーティションテーブルである場合も同様です。
5.12.2.2で説明されているように、サブパーティションのロックはCHECK
制約を追加することで回避できます。
DETACH PARTITION partition_name
[ CONCURRENTLY | FINALIZE ]
#
This form detaches the specified partition of the target table. The detached
partition continues to exist as a standalone table, but no longer has any
ties to the table from which it was detached. Any indexes that were
attached to the target table's indexes are detached. Any triggers that
were created as clones of those in the target table are removed.
<literal>SHARE</literal> lock is obtained on any tables that reference
this partitioned table in foreign key constraints.
この構文は、指定したパーティションを対象のテーブルから切り離します。
切り離されたパーティションは単独のテーブルとして存在し続けますが、切り離される前のテーブルとの紐付けはなくなります。
対象テーブルのインデックスに付加されていた全てのインデックスも切り離されます。
対象テーブルのものの複製として作られたトリガは削除されます。
SHARE
ロックは、外部キー制約でこのパーティションテーブルを参照するすべてのテーブルで取得されます。
If <literal>CONCURRENTLY</literal> is specified, it runs using a reduced
lock level to avoid blocking other sessions that might be accessing the
partitioned table. In this mode, two transactions are used internally.
During the first transaction, a <literal>SHARE UPDATE EXCLUSIVE</literal>
lock is taken on both parent table and partition, and the partition is
marked as undergoing detach; at that point, the transaction is committed
and all other transactions using the partitioned table are waited for.
Once all those transactions have completed, the second transaction
acquires <literal>SHARE UPDATE EXCLUSIVE</literal> on the partitioned
table and <literal>ACCESS EXCLUSIVE</literal> on the partition,
and the detach process completes. A <literal>CHECK</literal> constraint
that duplicates the partition constraint is added to the partition.
<literal>CONCURRENTLY</literal> cannot be run in a transaction block and
is not allowed if the partitioned table contains a default partition.
CONCURRENTLY
が指定されている場合、パーティションテーブルにアクセスしている可能性のある他のセッションをブロックしないように、ロックレベルを下げて実行します。
このモードでは、2つのトランザクションが内部で使用されます。
最初のトランザクションでは、SHARE UPDATE EXCLUSIVE
ロックが親テーブルとパーティションの両方で取得され、パーティションはデタッチ中としてマークされます。
その時点で、トランザクションはコミットされ、パーティションテーブルを使用する他のすべてのトランザクションは待機されます。
これらのトランザクションがすべて完了すると、2番目のトランザクションがパーティションテーブルのSHARE UPDATE EXCLUSIVE
を取得し、パーティションでACCESS EXCLUSIVE
を取得し、デタッチプロセスが完了します。
パーティション制約と重複するCHECK
制約がパーティションに追加されます。
CONCURRENTLY
はトランザクションブロック内で実行することはできず、パーティションテーブルにデフォルトパーティションが含まれる場合は許可されません。
If <literal>FINALIZE</literal> is specified, a previous
<literal>DETACH CONCURRENTLY</literal> invocation that was canceled or
interrupted is completed.
At most one partition in a partitioned table can be pending detach at
a time.
FINALIZE
が指定されている場合、キャンセルまたは中断された以前のDETACH CONCURRENTLY
の呼び出しは完了します。
パーティションテーブル内で多くても1つのパーティションが一度にデタッチを保留できます。
All the forms of ALTER TABLE that act on a single table, except
<literal>RENAME</literal>, <literal>SET SCHEMA</literal>,
<literal>ATTACH PARTITION</literal>, and
<literal>DETACH PARTITION</literal> can be combined into
a list of multiple alterations to be applied together. For example, it
is possible to add several columns and/or alter the type of several
columns in a single command. This is particularly useful with large
tables, since only one pass over the table need be made.
RENAME
、SET SCHEMA
、ATTACH PARTITION
、DETACH PARTITION
は、複数の変更リストに結合して、まとめて処理することができますが、それらを除き、ALTER TABLEのすべての構文は1つだけのテーブルに対して作用します。
例えば、複数の列の追加、型の変更を単一のコマンドで実行することができます。
これは特に巨大なテーブルでは便利です。変更のために必要なテーブル全体のスキャンが1回で済むからです。
You must own the table to use <command>ALTER TABLE</command>.
To change the schema or tablespace of a table, you must also have
<literal>CREATE</literal> privilege on the new schema or tablespace.
To add the table as a new child of a parent table, you must own the parent
table as well. Also, to attach a table as a new partition of the table,
you must own the table being attached.
To alter the owner, you must be able to <literal>SET ROLE</literal> to the
new owning role, and that role must have <literal>CREATE</literal>
privilege on the table's schema.
(These restrictions enforce that altering the owner
doesn't do anything you couldn't do by dropping and recreating the table.
However, a superuser can alter ownership of any table anyway.)
To add a column or alter a column type or use the <literal>OF</literal>
clause, you must also have <literal>USAGE</literal> privilege on the data
type.
ALTER TABLE
コマンドを使用するには、変更するテーブルを所有している必要があります。
テーブルのスキーマあるいはテーブル空間を変更するには、新しいスキーマあるいはテーブル空間におけるCREATE
権限も持っていなければなりません。
テーブルを親テーブルの新しい子テーブルとして追加するには、親テーブルも所有している必要があります。
またテーブルをテーブルのパーティションとして追加する場合、追加されるテーブルを所有している必要があります。
所有者を変更するには、新しい所有者ロールに対してSET ROLE
ができなければなりません。また、そのロールはテーブルのスキーマにおいてCREATE
権限を持たなければなりません。
(この制限により、テーブルの削除と再作成を行ってもできないことが、所有者の変更によってもできないようにしています。
ただし、スーパーユーザはすべてのテーブルの所有者を変更することができます。)
列の追加、列の型の変更、OF
句の使用を行うためには、データ型に対するUSAGE
権限を持たなければなりません。
IF EXISTS
#Do not throw an error if the table does not exist. A notice is issued in this case. テーブルが存在しない場合でもエラーとしません。 この場合は注意メッセージが発行されます。
name
#
The name (optionally schema-qualified) of an existing table to
alter. If <literal>ONLY</literal> is specified before the table name, only
that table is altered. If <literal>ONLY</literal> is not specified, the table
and all its descendant tables (if any) are altered. Optionally,
<literal>*</literal> can be specified after the table name to explicitly
indicate that descendant tables are included.
変更対象となる既存のテーブルの名前です(スキーマ修飾名も可)。
テーブル名の前にONLY
が指定された場合、そのテーブルのみが変更されます。
ONLY
が指定されていない場合、そのテーブルおよび(もしあれば)そのテーブルを継承する全てのテーブルが更新されます。
オプションで、テーブル名の後に*
を指定することで、明示的に継承するテーブルも含まれることを示すことができます。
column_name
#Name of a new or existing column. 新規または既存の列の名前です。
new_column_name
#New name for an existing column. 既存の列の新しい名前です。
new_name
#New name for the table. テーブルの新しい名前です。
data_type
#Data type of the new column, or new data type for an existing column. 新しい列のデータ型、もしくは既存の列に対する新しいデータ型です。
table_constraint
#New table constraint for the table. テーブルの新しいテーブル制約です。
constraint_name
#Name of a new or existing constraint. 新しい、あるいは既存の制約の名前です。
CASCADE
#Automatically drop objects that depend on the dropped column or constraint (for example, views referencing the column), and in turn all objects that depend on those objects (see <xref linkend="ddl-depend"/>). 削除された列や制約に依存しているオブジェクト(例えば、削除された列を参照しているビューなど)を自動的に削除し、さらにそれらのオブジェクトに依存するすべてのオブジェクトも削除します(5.15参照)。
RESTRICT
#Refuse to drop the column or constraint if there are any dependent objects. This is the default behavior. 依存しているオブジェクトがある場合、列または制約の削除要求を拒否します。 これがデフォルトの動作です。
trigger_name
#Name of a single trigger to disable or enable. 有効または無効にする単一のトリガの名前です。
ALL
#Disable or enable all triggers belonging to the table. (This requires superuser privilege if any of the triggers are internally generated constraint triggers, such as those that are used to implement foreign key constraints or deferrable uniqueness and exclusion constraints.) テーブルに属するすべてのトリガを有効または無効にします。 (外部キー制約、遅延可能な一意性および排他制約を実装するために使用される、内部向けに生成される制約トリガが含まれる場合、スーパーユーザ権限が必要です。)
USER
#Disable or enable all triggers belonging to the table except for internally generated constraint triggers, such as those that are used to implement foreign key constraints or deferrable uniqueness and exclusion constraints. 外部キー制約、遅延可能な一意性および排他制約を実装するために使用される、内部向けに生成されるトリガを除く、テーブルに属するトリガすべてを有効または無効にします。
index_name
#The name of an existing index. 既存のインデックスの名前です。
storage_parameter
#The name of a table storage parameter. テーブルの格納パラメータの名前です。
value
#The new value for a table storage parameter. This might be a number or a word depending on the parameter. テーブルの格納パラメータの新しい値です。 パラメータによりこれは数値となることも文字列となることもあります。
parent_table
#A parent table to associate or de-associate with this table. このテーブルに関連付ける、または、このテーブルから関連付けを取り除く親テーブルです。
new_owner
#The user name of the new owner of the table. テーブルの新しい所有者のユーザ名です。
new_access_method
#The name of the access method to which the table will be converted. テーブルを変換する先のアクセスメソッドの名前です。
new_tablespace
#The name of the tablespace to which the table will be moved. テーブルを移動する先のテーブル空間の名前です。
new_schema
#The name of the schema to which the table will be moved. テーブルを移動する先のスキーマの名前です。
partition_name
#The name of the table to attach as a new partition or to detach from this table. 新しいパーティションとして追加する、またはテーブルから切り離すテーブルの名前です。
partition_bound_spec
#The partition bound specification for a new partition. Refer to <xref linkend="sql-createtable"/> for more details on the syntax of the same. 新しいパーティションのパーティション境界の指定です。 その構文の詳細についてはCREATE TABLEを参照してください。
The key word <literal>COLUMN</literal> is noise and can be omitted.
COLUMN
キーワードには意味がなく、省略可能です。
When a column is added with <literal>ADD COLUMN</literal> and a
non-volatile <literal>DEFAULT</literal> 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 <literal>DEFAULT</literal> is specified, NULL is used. In
neither case is a rewrite of the table required.
ADD COLUMN
で列が追加され、非変動性のDEFAULT
が指定されたときには、デフォルトは宣言時に評価されてテーブルのメタデータに格納された結果です。
この値は全ての既存行の列に使われます。
DEFAULT
が指定されなかった場合にはNULLが使われます。
どちらの場合もテーブルを書き直す必要はありません。
Adding a column with a volatile <literal>DEFAULT</literal> 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 <literal>USING</literal> 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. However, indexes must always be rebuilt unless the system can
verify that the new index would be logically equivalent to the existing
one. For example, if the collation for a column has been changed, an index
rebuild is always required because the new sort order might be different.
However, in the absence of a collation change, a column can be changed
from <type>text</type> to <type>varchar</type> (or vice versa) without
rebuilding the indexes because these data types sort identically.
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.
変動性のDEFAULT
句を持つ列を追加したり、既存の列の型を変更するには、テーブルとインデックス全体の書き換えが必要になります。
例外として、既存列の型を変更するとき、USING
句が列の内容を変更せず、かつ、古い型が新しい型とバイナリ変換可能であるか新しい型全体に対する制約のないドメインである場合、テーブルの書き換えは必要ありません。
しかし、新しいインデックスが既存のものと論理的に等しいとシステムが確認できないのであれば、インデックスは常に再構築しなければなりません。
例えば、列の照合順序が変更された場合には、新しいソート順が異なるかもしれませんので、インデックスの再構築は常に必要です。
しかし、照合順序の変更がなければ、インデックスの再構築なしで列をtext
からvarchar
へ(またはその逆)と変更できます。データ型のソートが同一だからです。
テーブルが巨大な場合、テーブル、インデックスまたはその両方の再構築には非常に時間がかかる可能性があります。
また、一時的に2倍のディスク容量が必要とされます。
Adding a <literal>CHECK</literal> or <literal>NOT NULL</literal> constraint requires
scanning the table to verify that existing rows meet the constraint,
but does not require a table rewrite.
CHECK
あるいはNOT NULL
制約を追加する時は、既存の行が制約に従うかどうかを検証するためにテーブルのスキャンが必要になりますが、テーブルの書き換えは必要ありません。
Similarly, when attaching a new partition it may be scanned to verify that existing rows meet the partition constraint. 同様に、新しいパーティションを追加するときは、既存の行がパーティションの制約を満たすかどうかを確認するため、テーブルがスキャンされるかもしれません。
The main reason for providing the option to specify multiple changes
in a single <command>ALTER TABLE</command> is that multiple table scans or
rewrites can thereby be combined into a single pass over the table.
単一のALTER TABLE
内に複数の変更を指定できるオプションを提供する主な理由は、複数のテーブルスキャンや書き換えを1回のテーブルスキャンにまとめることができるようにすることです。
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 <command>ALTER TABLE ADD CONSTRAINT</command> command is
committed. The main purpose of the <literal>NOT VALID</literal>
constraint option is to reduce the impact of adding a constraint on
concurrent updates. With <literal>NOT VALID</literal>,
the <command>ADD CONSTRAINT</command> command does not scan the table
and can be committed immediately. After that, a <literal>VALIDATE
CONSTRAINT</literal> 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 <literal>SHARE UPDATE EXCLUSIVE</literal> lock on the table being
altered. (If the constraint is a foreign key then a <literal>ROW
SHARE</literal> lock is also required on the table referenced by the
constraint.) In addition to improving concurrency, it can be useful to
use <literal>NOT VALID</literal> and <literal>VALIDATE
CONSTRAINT</literal> 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 <literal>VALIDATE CONSTRAINT</literal> finally
succeeds.
新しい外部キーや検査制約を検証するために大きなテーブルをスキャンするのは長い時間が掛かる可能性があり、ALTER TABLE ADD CONSTRAINT
コマンドがコミットされるまで、そのテーブルのその他の更新は締め出されます。
NOT VALID
制約オプションの主な目的は、同時実行中の更新に制約を追加する影響を減らすことです。
NOT VALID
を付ければ、ADD CONSTRAINT
コマンドはテーブルをスキャンせず、すぐにコミットされます。
その後で、VALIDATE CONSTRAINT
コマンドを発行して、既存の行が制約を満たすか検証できます。
他のトランザクションが挿入したり更新したりする行に対しては制約が強制されていることは分かっていますので、この検証操作では同時実行中の更新を締め出す必要はありません。既に存在する行だけ確認する必要があります。
それゆえ、検証には変更するテーブルのSHARE UPDATE EXCLUSIVE
ロックのみが必要です。
(制約が外部キーなら、制約が参照するテーブルのROW SHARE
ロックも必要です。)
同時実行性をさらに向上させるため、テーブルに既に制約違反が存在することを知っている場合にNOT VALID
とVALIDATE CONSTRAINT
を使うことは有用かもしれません。
一度制約が設定されれば、新しい違反は挿入されることはありませんし、既存の問題は、VALIDATE CONSTRAINT
を最終的に成功するまで使って、余裕のある時に修正できます。
The <literal>DROP COLUMN</literal> form does not physically remove
the column, but simply makes it invisible to SQL operations. Subsequent
insert and update operations in the table will store a null value for the
column. Thus, dropping a column is quick but it will not immediately
reduce the on-disk size of your table, as the space occupied
by the dropped column is not reclaimed. The space will be
reclaimed over time as existing rows are updated.
DROP COLUMN
構文は、列を物理的には削除せず、SQLの操作に対して不可視にします。
このコマンドを実行した後、テーブルに挿入または更新が行われると、削除した列にはNULLが格納されます。
したがって、列の削除は短時間で行えます。
しかし、削除された列が占めていた領域がまだ回収されていないため、テーブルのディスク上のサイズはすぐには小さくなりません。
この領域は、その後既存の行が更新されるにつれて回収されます。
To force immediate reclamation of space occupied by a dropped column,
you can execute one of the forms of <command>ALTER TABLE</command> that
performs a rewrite of the whole table. This results in reconstructing
each row with the dropped column replaced by a null value.
削除した列が占有していたスペースを即座に再利用できるようにするには、テーブル全体を書き換える構文のALTER TABLE
を使用することができます。
この結果、各行の削除される列がNULL値で再構成されます。
The rewriting forms of <command>ALTER TABLE</command> are not MVCC-safe.
After a table rewrite, the table will appear empty to concurrent
transactions, if they are using a snapshot taken before the rewrite
occurred. See <xref linkend="mvcc-caveats"/> for more details.
テーブルを書き換える構文のALTER TABLE
はMVCC的に安全ではありません。
同時実行中のトランザクションが、テーブル書き換えが発生する前に取得したスナップショットを使っている場合、テーブルの書き換え後はそのトランザクションにはテーブルが空であるように見えます。
詳しくは13.6を参照して下さい。
The <literal>USING</literal> option of <literal>SET DATA TYPE</literal> can actually
specify any expression involving the old values of the row; that is, it
can refer to other columns as well as the one being converted. This allows
very general conversions to be done with the <literal>SET DATA TYPE</literal>
syntax. Because of this flexibility, the <literal>USING</literal>
expression is not applied to the column's default value (if any); the
result might not be a constant expression as required for a default.
This means that when there is no implicit or assignment cast from old to
new type, <literal>SET DATA TYPE</literal> might fail to convert the default even
though a <literal>USING</literal> clause is supplied. In such cases,
drop the default with <literal>DROP DEFAULT</literal>, perform the <literal>ALTER
TYPE</literal>, and then use <literal>SET DEFAULT</literal> to add a suitable new
default. Similar considerations apply to indexes and constraints involving
the column.
SET DATA TYPE
のUSING
オプションでは、その行の古い値を含め、どのような式でも指定できます。
つまり、変換対象の列と同様に、その他の列も参照することができます。
そのため、一般的な変換をSET DATA TYPE
構文で行うことができます。
この柔軟性のため、USING
式は列のデフォルト値には(仮に存在していても)適用されません。
結果が定数式にならない可能性があるためです(デフォルト値は定数式でなければいけません)。
したがって、古い型から新しい型への暗黙キャストや代入キャストが存在しない場合、USING
句が指定されていても、SET DATA TYPE
がデフォルト値の変換に失敗する可能性があります。
この場合は、DROP DEFAULT
でデフォルト値を削除し、ALTER TYPE
を実行した後で、SET DEFAULT
を使用して再度適切なデフォルト値を指定してください。
変更対象の列を含むインデックスと制約も同様の配慮が必要です。
If a table has any descendant tables, it is not permitted to add,
rename, or change the type of a column in the parent table without doing
the same to the descendants. This ensures that the descendants always
have columns matching the parent. Similarly, a <literal>CHECK</literal>
constraint cannot be renamed in the parent without also renaming it in
all descendants, so that <literal>CHECK</literal> constraints also match
between the parent and its descendants. (That restriction does not apply
to index-based constraints, however.)
Also, because selecting from the parent also selects from its descendants,
a constraint on the parent cannot be marked valid unless it is also marked
valid for those descendants. In all of these cases, <command>ALTER TABLE
ONLY</command> will be rejected.
そのテーブルを継承するテーブルがある場合、子テーブルに同じ処理を実行しなければ、親テーブルに対する列の追加、列の名前、列の型の変更を実行することはできません。
この制限により、子テーブルの列が常に親テーブルと一致していることが保証されます。
同様に、すべての子テーブルでCHECK
制約の名前を変更し、それが親と子の間で一致するようにしなければ、親テーブルのCHECK
制約の名前を変更することはできません。
(しかし、この制限はインデックスの基づく制約にはあらわれません。)
また、親テーブルからSELECTすると、その子テーブルからもSELECTすることになるため、親テーブルの制約は、それが子テーブルでも有効であると印を付けられるまで、有効であると印を付けられません
これらのすべての場合において、ALTER TABLE ONLY
は受け付けられません。
A recursive <literal>DROP COLUMN</literal> operation will remove a
descendant table's column only if the descendant does not inherit
that column from any other parents and never had an independent
definition of the column. A nonrecursive <literal>DROP
COLUMN</literal> (i.e., <command>ALTER TABLE ONLY ... DROP
COLUMN</command>) never removes any descendant columns, but
instead marks them as independently defined rather than inherited.
A nonrecursive <literal>DROP COLUMN</literal> command will fail for a
partitioned table, because all partitions of a table must have the same
columns as the partitioning root.
再帰的なDROP COLUMN
操作では、子テーブルが他の親テーブルからその列を継承しておらず、かつ、その列について独立した定義を持っていない場合のみ、その子テーブルの列を削除します。
再帰的でないDROP COLUMN
(つまり、ALTER TABLE ONLY ... DROP COLUMN
)操作では、継承された列は削除されません。
削除する代わりに、その列は継承されておらず独立して定義されているという印を付けます。
再帰的でないDROP COLUMN
コマンドは、パーティションテーブルでは失敗します。
テーブルのすべてのパーティションは、パーティションの最上位と同じ列を持っていなければならないからです。
The actions for identity columns (<literal>ADD
GENERATED</literal>, <literal>SET</literal> etc., <literal>DROP
IDENTITY</literal>), as well as the actions
<literal>CLUSTER</literal>, <literal>OWNER</literal>,
and <literal>TABLESPACE</literal> never recurse to descendant tables;
that is, they always act as though <literal>ONLY</literal> were specified.
Actions affecting trigger states recurse to partitions of partitioned
tables (unless <literal>ONLY</literal> is specified), but never to
traditional-inheritance descendants.
Adding a constraint recurses only for <literal>CHECK</literal> constraints
that are not marked <literal>NO INHERIT</literal>.
IDENTITY列についての操作(ADD GENERATED
、SET
、DROP IDENTITY
など)およびCLUSTER
、OWNER
およびTABLESPACE
の操作は子テーブルに再帰的に伝わりません。
つまり、常にONLY
が指定されているかのように動作します。
トリガの状態に影響を与える操作は、(ONLY
が指定されていない限り)パーティション化されたテーブルのパーティションに再帰的に伝わりますが、従来の継承の子孫には再帰的に伝わりません。
制約の追加は、NO INHERIT
印がないCHECK
制約に関してのみ再帰的に伝わります。
Changing any part of a system catalog table is not permitted. システムカタログテーブルについては、いかなる部分の変更も許可されていません。
Refer to <xref linkend="sql-createtable"/> for a further description of valid parameters. <xref linkend="ddl"/> has further information on inheritance. 有効なパラメータの詳しい説明はCREATE TABLEを参照してください。 第5章に、継承に関するさらに詳しい情報があります。
To add a column of type <type>varchar</type> to a table:
varchar
型の列をテーブルに追加します。
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. これは表の既存の行すべてで、新しい列をNULL値で埋めることになります。
To add a column with a non-null default: デフォルトが非NULLの列を追加します。
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 <literal>old</literal>, but then
the default for subsequent commands will be <literal>current</literal>.
The effects are the same as if the two sub-commands had been issued
in separate <command>ALTER TABLE</command> commands.
既存の行はold
で埋められますが、後続のコマンドに対するデフォルトはcurrent
になります。
別々のALTER TABLE
コマンドで2つの副コマンドを発行する場合と、効果は同じです。
To drop a column from a table: テーブルから列を削除します。
ALTER TABLE distributors DROP COLUMN address RESTRICT;
To change the types of two existing columns in one operation: 1つの操作で既存の2つの列の型を変更します。
ALTER TABLE distributors ALTER COLUMN address TYPE varchar(80), ALTER COLUMN name TYPE varchar(100);
To change an integer column containing Unix timestamps to <type>timestamp
with time zone</type> via a <literal>USING</literal> clause:
USING
句を使用して、Unixタイムスタンプを持つinteger型の列を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';
The same, when the column has a default expression that won't automatically cast to the new data type: 上と同じことをします。 ただし、その列は、自動的に新しいデータ型にキャストされないデフォルト式を持つ場合についてです。
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();
To rename an existing column: 既存の列の名前を変更します。
ALTER TABLE distributors RENAME COLUMN address TO city;
To rename an existing table: 既存のテーブルの名前を変更します。
ALTER TABLE distributors RENAME TO suppliers;
To rename an existing constraint: 既存の制約の名前を変更します。
ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;
To add a not-null constraint to a column: 列に非NULL制約を付与します。
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
To remove a not-null constraint from a column: 列から非NULL制約を削除します。
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
To add a check constraint to a table and all its children: テーブルとそのすべての子テーブルにCHECK制約を付与します。
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
To add a check constraint only to a table and not to its children: そのテーブルのみに適用され、その子テーブルには適用されない検査制約を追加します。
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;
(The check constraint will not be inherited by future children, either.) (この検査制約はこの後作成される子テーブルにも継承されません。)
To remove a check constraint from a table and all its children: テーブルとそのすべての子テーブルからCHECK制約を削除します。
ALTER TABLE distributors DROP CONSTRAINT zipchk;
To remove a check constraint from one table only: 1つのテーブルのみから検査制約を削除します。
ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;
(The check constraint remains in place for any child tables.) (この検査制約はすべての子テーブルで残ったままです。)
To add a foreign key constraint to a table: テーブルに外部キー制約を付与します。
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);
To add a foreign key constraint to a table with the least impact on other work: テーブルへの外部キーの追加で、他の作業への影響を最小限にするには、以下のようにします。
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID; ALTER TABLE distributors VALIDATE CONSTRAINT distfk;
To add a (multicolumn) unique constraint to a table: テーブルに(複数列の)一意性制約を付与します。
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
To add an automatically named primary key constraint to a table, noting that a table can only ever have one primary key: 自動的に命名される主キー制約をテーブルに付与します。 1つのテーブルが持てる主キーは1つだけであることに注意してください。
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
To move a table to a different tablespace: テーブルを別のテーブル空間に移動します。
ALTER TABLE distributors SET TABLESPACE fasttablespace;
To move a table to a different schema: テーブルを別のスキーマに移動します。
ALTER TABLE myschema.distributors SET SCHEMA yourschema;
To recreate a primary key constraint, without blocking updates while the index is rebuilt: インデックスを再構築している間の更新をブロックすることなく、主キー制約を再作成します。
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;
To attach a partition to a range-partitioned table: 範囲パーティションテーブルにパーティションを追加します。
ALTER TABLE measurement ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
To attach a partition to a list-partitioned table: リストパーティションテーブルにパーティションを追加します。
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;
To detach a partition from a partitioned table: パーティションテーブルからパーティションを切り離します。
ALTER TABLE measurement DETACH PARTITION measurement_y2015m12;
The forms <literal>ADD</literal> (without <literal>USING INDEX</literal>),
<literal>DROP [COLUMN]</literal>, <literal>DROP IDENTITY</literal>, <literal>RESTART</literal>,
<literal>SET DEFAULT</literal>, <literal>SET DATA TYPE</literal> (without <literal>USING</literal>),
<literal>SET GENERATED</literal>, and <literal>SET <replaceable>sequence_option</replaceable></literal>
conform with the SQL standard. The other forms are
<productname>PostgreSQL</productname> extensions of the SQL standard.
Also, the ability to specify more than one manipulation in a single
<command>ALTER TABLE</command> command is an extension.
(USING INDEX
がない)ADD
、DROP [COLUMN]
、DROP IDENTITY
、RESTART
、SET DEFAULT
、(USING
のない)SET DATA TYPE
、SET GENERATED
、SET
構文は標準SQLに従います。
他の構文は標準SQLに対するPostgreSQLの拡張です。
また、単一のsequence_option
ALTER TABLE
コマンド内に複数の操作を指定する機能もPostgreSQLの拡張です。
<command>ALTER TABLE DROP COLUMN</command> can be used to drop the only
column of a table, leaving a zero-column table. This is an
extension of SQL, which disallows zero-column tables.
ALTER TABLE DROP COLUMN
を使って、1つしか列がないテーブルから列を削除して、列がないテーブルを作成することができます。
これはPostgreSQLの拡張です。SQLでは、列を持たないテーブルは認められていません。