sql - postgresql分区主表重复条目

标签 sql postgresql postgresql-9.1 database-partitioning

我已经创建了一个简单的分区结构,如下所示:

主表

CREATE TABLE parent_table
(
  id_n numeric(19,0) NOT NULL,
  name_v character varying(255),
  location_n numeric(19,0),
  CONSTRAINT parent_table_pkey PRIMARY KEY (id_n )
)

子表

CREATE TABLE child_table_location_1
(
-- Inherited from table parent_table:  id_n numeric(19,0) NOT NULL,
-- Inherited from table parent_table:  name_v character varying(255),
-- Inherited from table parent_table:  location_n numeric(19,0),
  CONSTRAINT child_table_location_1_pkey PRIMARY KEY (id_n ),
  CONSTRAINT child_table_location_1_location_n_check CHECK (location_n = 1::numeric)
)INHERITS (parent_table)

CREATE TABLE child_table_location_2
(
-- Inherited from table parent_table:  id_n numeric(19,0) NOT NULL,
-- Inherited from table parent_table:  name_v character varying(255),
-- Inherited from table parent_table:  location_n numeric(19,0),
  CONSTRAINT child_table_location_2_pkey PRIMARY KEY (id_n ),
  CONSTRAINT child_table_location_2_location_n_check CHECK (location_n = 2::numeric)
)INHERITS (parent_table)

触发器

CREATE OR REPLACE FUNCTION PARTITION_INSERTION_TRIGGER()
RETURNS TRIGGER AS 
$$
BEGIN
    EXECUTE 'INSERT INTO '|| QUOTE_IDENT('child_table_location_'||NEW.LOCATION_N)||' SELECT ($1).*' USING NEW;
    RETURN NEW;
END;
$$
LANGUAGE PLPGSQL;

CREATE TRIGGER INSERT_INTO_PARTITION_TRIGGER BEFORE INSERT ON PARENT_TABLE FOR EACH ROW EXECUTE PROCEDURE PARTITION_INSERTION_TRIGGER();

我创建了触发器,以便根据位置字段将数据填充到相应的子表中。

现在我有以下插入脚本:

INSERT INTO parent_table(id_n, name_v, location_n) VALUES (1, 'aaa', 1);
INSERT INTO parent_table(id_n, name_v, location_n) VALUES (2, 'bbb', 2);
INSERT INTO parent_table(id_n, name_v, location_n) VALUES (3, 'ccc', 1);
INSERT INTO parent_table(id_n, name_v, location_n) VALUES (4, 'ddd', 2);
INSERT INTO parent_table(id_n, name_v, location_n) VALUES (5, 'eee', 1);
INSERT INTO parent_table(id_n, name_v, location_n) VALUES (6, 'fff', 2);

当我从单个表中选择时:

子表 1

id_n| name_v| location_n
1|"aaa"|1
3|"ccc"|1
5|"eee"|1

子表 2

id_n| name_v| location_n
2|"bbb"|2
4|"ddd"|2
6|"fff"|2

但是当我查询主表时:

父表

id_n|name_v|location_n
1|"aaa"|1
1|"aaa"|1
2|"bbb"|2
2|"bbb"|2
3|"ccc"|1
3|"ccc"|1
4|"ddd"|2
4|"ddd"|2
5|"eee"|1
5|"eee"|1
6|"fff"|2
6|"fff"|2

即使在 id 字段上有主键约束后,我仍然从 parent_table 中得到重复的条目。

为什么会发生这种情况以及我应该对我的设计进行哪些更改。

等待快速响应。

提前致谢。

最佳答案

返回 NULL 不是干净的方法。

优雅的解决方案是让触发器“INSTEAD OF”

参见:http://www.postgresql.org/docs/9.3/static/sql-createtrigger.html

关于sql - postgresql分区主表重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24383176/

相关文章:

以下场景的 MYSQL 查询

MySql - 如何获取上一行的值和下一行的值?

python - Manage.py sqlall <myapp> 不创建列

java - PostgreSQL JDBC getGeneratedKeys 返回所有列

mysql - 是否可以按索引命名列

postgresql - 在不创建临时表的情况下加入数组 unnest 的输出

postgresql - Postgres 从动态 sql 字符串创建本地临时表(在提交时删除)

mysql - SQL 连接表以获取其他表数据

mysql - SQL 查询 : Separate column where IDs are the same but type is different

PostgreSQL 8.4 Win 32 位,到 64 位 Linux 的复制策略