我在 postgresql 中有一个表,我希望它被分区。结构如下
TABLE "DTD1"."logAdminActivity" (
"username" CHARACTER VARYING( 200 ) NOT NULL,
"action" CHARACTER VARYING( 100 ) NOT NULL,
"pk" CHARACTER VARYING( 5 ) NOT NULL,
"tabel" CHARACTER VARYING( 200 )NOT NULL,
"timestamp" TIMESTAMP WITHOUT TIME ZONE
);
然后我创建了一些继承 Tabel "DTD1"."logAdminActivity" 的分区表,如下所示:
CREATE TABLE "DTD1".logAdminActivity_kategori (
CHECK ('tabel'='kategori')
) INHERITS ("DTD1"."logAdminActivity");
CREATE TABLE "DTD1".logAdminActivity_subyek (
CHECK ('tabel'='subyek')
) INHERITS ("DTD1"."logAdminActivity");
...
CREATE TABLE "DTD1".logAdminActivity_satuan (
CHECK ('tabel'='satuan')
) INHERITS ("DTD1"."logAdminActivity");
CREATE TABLE "DTD1".logAdminActivity_memberfilter (
CHECK ('tabel'='memberFilter')
) INHERITS ("DTD1"."logAdminActivity");
之后,我在用户名列中为每个分区表创建索引。然后我创建这个触发函数并在下面触发调用该触发函数。因此,当我插入数据时,对应的表列将被重定向到正确的分区表中。
CREATE OR REPLACE FUNCTION "DTD1".logAdminActivity_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( New."tabel" = 'kategori' ) THEN
INSERT INTO "DTD1".logAdminActivity_kategori VALUES (NEW.*);
ELSIF ( New."tabel" = 'subyek' ) THEN
INSERT INTO "DTD1".logAdminActivity_subyek VALUES (NEW.*);
..
ELSE
RAISE EXCEPTION 'Tabel out of range. Fix the logAdminActivity_insert_trigger() function!' ;
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER insert_logAdminActivity_trigger
BEFORE INSERT ON "DTD1"."logAdminActivity"
FOR EACH ROW EXECUTE PROCEDURE "DTD1".logAdminActivity_insert_trigger();
然后我通过插入程序进行测试,例如
INSERT INTO "DTD1"."logadminactivity_subyek" ( "action", "pk", "tabel", "timestamp", "username")
VALUES ( 'bla', '12312', 'subyek', '2014-01-01 02:02:03', 'asdf' );
但是为什么它返回错误看起来像这样
错误:关系“logadminactivity_subyek”的新行违反检查约束“logadminactivity_subyek_check” 详细信息:失败行包含(asdf、bla、subyek、12312、2014-01-01 02:02:03)。
怎么会发生,因为我尝试遵循此文档?
http://www.postgresql.org/docs/9.3/static/ddl-partitioning.html
我认为上面查询中的 'tabel' 值('subyek')与触发函数不匹配,但是当我检查时检查约束它通过。有没有我想念的部分,或者有什么解决方案可以解决这个问题?
问候