pg库分表操作步骤- PostgreSQL 分区表
原表结构
CREATE TABLE message (id VARCHAR(32) PRIMARY KEY,t_id VARCHAR(32),content TEXT,time TIMESTAMP,user_id VARCHAR(10),receive_user_id VARCHAR(10),type SMALLINT,send_flag SMALLINT,remark VARCHAR(50),receive_time TIMESTAMP
);
一、主表定义(父表)
CREATE TABLE message (id VARCHAR(32),t_id VARCHAR(32),content TEXT,time TIMESTAMP NOT NULL,user_id VARCHAR(10),receive_user_id VARCHAR(10),type SMALLINT,send_flag SMALLINT,remark VARCHAR(50),receive_time TIMESTAMP,PRIMARY KEY (id, time)
) PARTITION BY RANGE (time);
二、子表定义(按月分区)
-- 2025年5月分区
CREATE TABLE message_202505 PARTITION OF messageFOR VALUES FROM ('2025-05-01 00:00:00') TO ('2025-06-01 00:00:00');-- 2025年6月分区
CREATE TABLE message_202506 PARTITION OF messageFOR VALUES FROM ('2025-06-01 00:00:00') TO ('2025-07-01 00:00:00');
三、自动化建子表建议(可选)
你可以使用如下 SQL + Bash 脚本 生成未来12个月的子表:
DO $$
DECLAREi INT;start_date DATE;end_date DATE;table_name TEXT;
BEGINFOR i IN 0..11 LOOPstart_date := date_trunc('month', current_date) + (i || ' month')::interval;end_date := start_date + interval '1 month';table_name := 'message_' || to_char(start_date, 'YYYYMM');EXECUTE format('CREATE TABLE IF NOT EXISTS %I PARTITION OF messageFOR VALUES FROM (%L) TO (%L);', table_name, start_date, end_date);END LOOP;
END $$;
五、插入、查询示例
-- 插入
INSERT INTO message (id, t_id, content, time, user_id, receive_user_id, type, send_flag, remark, receive_time)
VALUES ('abc123', 't1', 'hello', '2025-05-18 12:00:00', 'U1', 'U2', 1, 0, 'test', now());-- 查询
SELECT * FROM message
WHERE time BETWEEN '2025-05-01' AND '2025-05-31';
六、与 MyBatis 使用建议
<select id="selectByTime" resultType="Message">SELECT * FROM messageWHERE time BETWEEN #{startTime} AND #{endTime}
</select>只要条件中带 time,PostgreSQL 会自动路由到对应分区。