1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-24 10:47:04 +03:00

Improve partitioning example, per Itagaki Takahiro.

This commit is contained in:
Tom Lane 2007-12-03 04:59:55 +00:00
parent 531f58688a
commit 57da4cca27

View File

@ -1,4 +1,4 @@
<!-- $PostgreSQL: pgsql/doc/src/sgml/ddl.sgml,v 1.78 2007/12/02 19:20:32 tgl Exp $ --> <!-- $PostgreSQL: pgsql/doc/src/sgml/ddl.sgml,v 1.79 2007/12/03 04:59:55 tgl Exp $ -->
<chapter id="ddl"> <chapter id="ddl">
<title>Data Definition</title> <title>Data Definition</title>
@ -2466,8 +2466,9 @@ CREATE TABLE measurement_y2008m01 ( ) INHERITS (measurement);
<listitem> <listitem>
<para> <para>
We must add non-overlapping table constraints, so that our We must provide non-overlapping table constraints. Rather than
table creation script becomes: just creating the partition tables as above, the table creation
script should really be:
<programlisting> <programlisting>
CREATE TABLE measurement_y2006m02 ( CREATE TABLE measurement_y2006m02 (
@ -2550,12 +2551,12 @@ CREATE TRIGGER insert_measurement_trigger
CREATE OR REPLACE FUNCTION measurement_insert_trigger() CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS $$ RETURNS TRIGGER AS $$
BEGIN BEGIN
IF ( logdate &gt;= DATE '2006-02-01' AND logdate &lt; DATE '2006-03-01' ) THEN IF ( NEW.logdate &gt;= DATE '2006-02-01' AND NEW.logdate &lt; DATE '2006-03-01' ) THEN
INSERT INTO measurement_y2006m02 VALUES (NEW.*); INSERT INTO measurement_y2006m02 VALUES (NEW.*);
ELSIF ( logdate &gt;= DATE '2006-03-01' AND logdate &lt; DATE '2006-04-01' ) THEN ELSIF ( NEW.logdate &gt;= DATE '2006-03-01' AND NEW.logdate &lt; DATE '2006-04-01' ) THEN
INSERT INTO measurement_y2006m03 VALUES (NEW.*); INSERT INTO measurement_y2006m03 VALUES (NEW.*);
... ...
ELSIF ( logdate &gt;= DATE '2008-01-01' AND logdate &lt; DATE '2008-02-01' ) THEN ELSIF ( NEW.logdate &gt;= DATE '2008-01-01' AND NEW.logdate &lt; DATE '2008-02-01' ) THEN
INSERT INTO measurement_y2008m01 VALUES (NEW.*); INSERT INTO measurement_y2008m01 VALUES (NEW.*);
ELSE ELSE
RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!'; RAISE EXCEPTION 'Date out of range. Fix the measurement_insert_trigger() function!';
@ -2576,6 +2577,15 @@ LANGUAGE plpgsql;
it doesn't need to be updated as often, since branches can be it doesn't need to be updated as often, since branches can be
added in advance of being needed. added in advance of being needed.
</para> </para>
<note>
<para>
In practice it might be best to check the newest partition first,
if most inserts go into that partition. For simplicity we have
shown the trigger's tests in the same order as in other parts
of this example.
</para>
</note>
</listitem> </listitem>
</orderedlist> </orderedlist>
</para> </para>