- ATTACH PARTITION partition_name partition_bound_spec
+ ATTACH PARTITION partition_name FOR VALUES partition_bound_spec
This form attaches an existing table (which might itself be partitioned)
Attach a partition to list partitioned table:
ALTER TABLE cities
- ATTACH PARTITION cities_west FOR VALUES IN ('Los Angeles', 'San Francisco');
+ ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');
- PARTITION OF parent_table
+ PARTITION OF parent_table FOR VALUES partition_bound_spec
Creates the table as partition of the specified
Rows inserted into a partitioned table will be automatically routed to
the correct partition. If no suitable partition exists, an error will
- occur.
+ occur. Also, if updating a row in a given partition causes it to move
+ to another partition due to the new partition key, an error will occur.
Create a range partitioned table:
CREATE TABLE measurement (
- city_id int not null,
logdate date not null,
peaktemp int,
unitsales int
Create a list partitioned table:
CREATE TABLE cities (
+ city_id bigserial not null,
name text not null,
- population int,
-) PARTITION BY LIST (initcap(name));
+ population bigint,
+) PARTITION BY LIST (left(lower(name), 1));
CREATE TABLE measurement_y2016m07
PARTITION OF measurement (
- unitsales WITH OPTIONS DEFAULT 0
+ unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
Create partition of a list partitioned table:
-CREATE TABLE cities_west
+CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
-) FOR VALUES IN ('Los Angeles', 'San Francisco');
+) FOR VALUES IN ('a', 'b');
Create partition of a list partitioned table that is itself further
partitioned and then add a partition to it:
-CREATE TABLE cities_west
+CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
-) FOR VALUES IN ('Los Angeles', 'San Francisco') PARTITION BY RANGE (population);
+) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);
-CREATE TABLE cities_west_10000_to_100000
- PARTITION OF cities_west FOR VALUES FROM (10000) TO (100000);
+CREATE TABLE cities_ab_10000_to_100000
+ PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);
sub-selects is safer, though often harder to read and slower than
using a join.
+
+ In the case of a partitioned table, updating a row might cause it to no
+ longer satisfy the partition constraint. Since there is no provision to
+ move the row to the partition appropriate to the new value of its
+ partitioning key, an error will occur in this case. This can also happen
+ when updating a partition directly.
+