
# 分区表插入数据报错：inserted partition key does not map to any table partition
#### 问题现象
给范围分区表插入数据报错：inserted partition key does not map to any table partition。
```
CREATE TABLE startend_pt (c1 INT, c2 INT) 
DISTRIBUTE BY HASH (c1) 
PARTITION BY RANGE (c2) (
    PARTITION p1 START(1) END(1000) EVERY(200) ,
    PARTITION p2 END(2000),
    PARTITION p3 START(2000) END(2500) ,
    PARTITION p4 START(2500),
    PARTITION p5 START(3000) END(5000) EVERY(1000) 
);
SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt';
 partition_name | high_value
----------------+------------
 p1_0           | 1
 p1_1           | 201
 p1_2           | 401
 p1_3           | 601
 p1_4           | 801
 p1_5           | 1000
 p2             | 2000
 p3             | 2500
 p4             | 3000
 p5_1           | 4000
 p5_2           | 5000
(11 rows)
INSERT INTO startend_pt VALUES (1,5001);
ERROR:  dn_6003_6004: inserted partition key does not map to any table partition
```
#### 原因分析
范围分区是根据表的一列或者多列，将要插入表的数据分为若干个范围，这些范围在不同的分区里没有重叠。划分好分区后，根据分区键值将数据映射到已创建的某个分区上，如果可以映射到已创建的某一分区上，则把记录插入到对应的分区上，否则给出报错和提示信息。
示例中的分区表startend_pt是以c2列为partition_key，将插入表的数据分为5个没有重叠的分区。而插入的数据中，c2列对应的数据5001已超过了分区表中划分的分区范围（即5001\>5000），因此报错。
#### 处理方法
应根据数据实际情况规划分区，以保证插入的数据都在规划好的分区中。
如果已规划的分区无法满足实际应用条件，可以增加分区后再插入数据。针对上述案例，可以增加分区c2，分区范围介于5000和MAXVALUE之间：
```
ALTER TABLE startend_pt ADD PARTITION P6 VALUES LESS THAN (MAXVALUE);
SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt';
 partition_name | high_value
----------------+------------
 p1_0           | 1
 p1_1           | 201
 p1_2           | 401
 p1_3           | 601
 p1_4           | 801
 p1_5           | 1000
 p2             | 2000
 p3             | 2500
 p4             | 3000
 p5_1           | 4000
 p5_2           | 5000
 p6             | MAXVALUE
(12 rows)
INSERT INTO startend_pt VALUES (1,5001);
SELECT * FROM startend_pt;
 c1 |  c2
----+------
  1 | 5001
(1 row)
```
