mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Allow a partitioned table to have a default partition.
Any tuples that don't route to any other partition will route to the default partition. Jeevan Ladhe, Beena Emerson, Ashutosh Bapat, Rahila Syed, and Robert Haas, with review and testing at various stages by (at least) Rushabh Lathia, Keith Fiske, Amit Langote, Amul Sul, Rajkumar Raghuanshi, Sven Kunze, Kyotaro Horiguchi, Thom Brown, Rafia Sabih, and Dilip Kumar. Discussion: http://postgr.es/m/CAH2L28tbN4SYyhS7YV1YBWcitkqbhSWfQCy0G=apRcC_PEO-bg@mail.gmail.com Discussion: http://postgr.es/m/CAOG9ApEYj34fWMcvBMBQ-YtqR9fTdXhdN82QEKG0SVZ6zeL1xg@mail.gmail.com
This commit is contained in:
@ -4738,6 +4738,17 @@ SCRAM-SHA-256$<replaceable><iteration count></>:<replaceable><salt><
|
||||
<entry>The number of columns in partition key</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>partdefid</structfield></entry>
|
||||
<entry><type>oid</type></entry>
|
||||
<entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry>
|
||||
<entry>
|
||||
The OID of the <structname>pg_class</> entry for the default partition
|
||||
of this partitioned table, or zero if this partitioned table does not
|
||||
have a default partition.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><structfield>partattrs</structfield></entry>
|
||||
<entry><type>int2vector</type></entry>
|
||||
|
@ -34,7 +34,7 @@ ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
|
||||
ALTER TABLE ALL IN TABLESPACE <replaceable class="PARAMETER">name</replaceable> [ OWNED BY <replaceable class="PARAMETER">role_name</replaceable> [, ... ] ]
|
||||
SET TABLESPACE <replaceable class="PARAMETER">new_tablespace</replaceable> [ NOWAIT ]
|
||||
ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
|
||||
ATTACH PARTITION <replaceable class="PARAMETER">partition_name</replaceable> FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable>
|
||||
ATTACH PARTITION <replaceable class="PARAMETER">partition_name</replaceable> { FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable> | DEFAULT }
|
||||
ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
|
||||
DETACH PARTITION <replaceable class="PARAMETER">partition_name</replaceable>
|
||||
|
||||
@ -765,11 +765,18 @@ ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><literal>ATTACH PARTITION <replaceable class="PARAMETER">partition_name</replaceable> FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable></literal></term>
|
||||
<term><literal>ATTACH PARTITION <replaceable class="PARAMETER">partition_name</replaceable> { FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable> | DEFAULT }</literal></term>
|
||||
<listitem>
|
||||
<para>
|
||||
This form attaches an existing table (which might itself be partitioned)
|
||||
as a partition of the target table using the same syntax for
|
||||
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>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
A partition using <literal>FOR VALUES</literal> uses same syntax for
|
||||
<replaceable class="PARAMETER">partition_bound_spec</replaceable> as
|
||||
<xref linkend="sql-createtable">. The partition bound specification
|
||||
must correspond to the partitioning strategy and partition key of the
|
||||
@ -806,6 +813,17 @@ ALTER TABLE [ IF EXISTS ] <replaceable class="PARAMETER">name</replaceable>
|
||||
(See the discussion in <xref linkend="SQL-CREATEFOREIGNTABLE"> about
|
||||
constraints on the foreign table.)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
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.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
@ -1395,6 +1413,13 @@ ALTER TABLE cities
|
||||
ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
|
||||
</programlisting></para>
|
||||
|
||||
<para>
|
||||
Attach a default partition to a partitioned table:
|
||||
<programlisting>
|
||||
ALTER TABLE cities
|
||||
ATTACH PARTITION cities_partdef DEFAULT;
|
||||
</programlisting></para>
|
||||
|
||||
<para>
|
||||
Detach a partition from partitioned table:
|
||||
<programlisting>
|
||||
|
@ -49,7 +49,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
|
||||
{ <replaceable class="PARAMETER">column_name</replaceable> [ WITH OPTIONS ] [ <replaceable class="PARAMETER">column_constraint</replaceable> [ ... ] ]
|
||||
| <replaceable>table_constraint</replaceable> }
|
||||
[, ... ]
|
||||
) ] FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable>
|
||||
) ] { FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable> | DEFAULT }
|
||||
[ PARTITION BY { RANGE | LIST } ( { <replaceable class="parameter">column_name</replaceable> | ( <replaceable class="parameter">expression</replaceable> ) } [ COLLATE <replaceable class="parameter">collation</replaceable> ] [ <replaceable class="parameter">opclass</replaceable> ] [, ... ] ) ]
|
||||
[ WITH ( <replaceable class="PARAMETER">storage_parameter</replaceable> [= <replaceable class="PARAMETER">value</replaceable>] [, ... ] ) | WITH OIDS | WITHOUT OIDS ]
|
||||
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
|
||||
@ -250,11 +250,13 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry id="SQL-CREATETABLE-PARTITION">
|
||||
<term><literal>PARTITION OF <replaceable class="PARAMETER">parent_table</replaceable> FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable></literal></term>
|
||||
<term><literal>PARTITION OF <replaceable class="PARAMETER">parent_table</replaceable> { FOR VALUES <replaceable class="PARAMETER">partition_bound_spec</replaceable> | DEFAULT }</literal></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Creates the table as a <firstterm>partition</firstterm> of the specified
|
||||
parent table.
|
||||
parent table. The table can be created either as a partition for specific
|
||||
values using <literal>FOR VALUES</literal> or as a default partition
|
||||
using <literal>DEFAULT</literal>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
@ -342,6 +344,26 @@ FROM ( { <replaceable class="PARAMETER">numeric_literal</replaceable> | <replace
|
||||
allows precisely one value to be stored — "infinity".
|
||||
</para>
|
||||
|
||||
<para>
|
||||
If <literal>DEFAULT</literal> is specified, the table will be
|
||||
created as a default partition of the parent table. The parent can
|
||||
either be a list or range partitioned table. A partition key value
|
||||
not fitting into any other partition of the given parent will be
|
||||
routed to the default partition. There can be only one default
|
||||
partition for a given parent table.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
When a table has an existing <literal>DEFAULT</literal> partition and
|
||||
a new partition is added to it, the existing default partition must
|
||||
be scanned to verify that it does not contain any rows which properly
|
||||
belong in the new partition. If the default partition contains a
|
||||
large number of rows, this may be slow. The scan will be skipped if
|
||||
the default partition is a foreign table or if it has a constraint which
|
||||
proves that it cannot contain rows which should be placed in the new
|
||||
partition.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
A partition must have the same column names and types as the partitioned
|
||||
table to which it belongs. If the parent is specified <literal>WITH
|
||||
@ -1679,6 +1701,13 @@ CREATE TABLE cities_ab
|
||||
CREATE TABLE cities_ab_10000_to_100000
|
||||
PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);
|
||||
</programlisting></para>
|
||||
|
||||
<para>
|
||||
Create a default partition:
|
||||
<programlisting>
|
||||
CREATE TABLE cities_partdef
|
||||
PARTITION OF cities DEFAULT;
|
||||
</programlisting></para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1 id="SQL-CREATETABLE-compatibility">
|
||||
|
Reference in New Issue
Block a user