插入视图不返回主键

Posted

技术标签:

【中文标题】插入视图不返回主键【英文标题】:Insert into view not returning primary key 【发布时间】:2016-06-29 12:33:45 【问题描述】:

我已将 POCO 映射到视图。当 EF 进行插入时,它会生成以下命令...

INSERT INTO "public"."vw_place"("Name","Description","Point") VALUES ($1,$2,$3) RETURNING "PlaceId"

但是代码,抛出以下错误...

"为一个不可为空的成员返回了一个空的存储生成值 'DataAccess.Place' 类型的 'PlaceId'。"

这是执行插入的触发器函数...

CREATE OR REPLACE FUNCTION vw_place_dml()
  RETURNS trigger AS
$BODY$
                   BEGIN
                      IF TG_OP = 'INSERT' THEN

                        INSERT INTO tbl_place
                        (
                        "Name",
                        "Description",
                        "Point"
                    )
                    VALUES
                    (
                        NEW."Name",
                        NEW."Description",
                        ST_GeomFromWKB(NEW."Point", 4326)
                    );

                            RETURN NEW;

                            ELSIF TG_OP = 'UPDATE' THEN

                          UPDATE tbl_place SET
                        "PlaceId" = NEW."PlaceId",
                        "Name" = NEW."Name",
                        "Description" = NEW."Description",
                        "Point" = ST_GeomFromWKB(NEW."Point", 4326)
                    WHERE
                        "PlaceId" = OLD."PlaceId";

                            RETURN NEW;

                            END IF;
                            RETURN NEW;
                            END;
                $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION vw_place_dml()
  OWNER TO postgres;

如果我在 pgAdmin 中运行它,它不会返回任何内容,这就是问题所在,但该行已成功插入并生成了 PlaceId。

INSERT INTO "public"."vw_place"("Name","Description","Point") VALUES
('ergw','regr','\x0101000000000000009846b2bfe4e068d7ff33a73f')

RETURNING "PlaceId"

【问题讨论】:

【参考方案1】:

在触发函数中插入之后,RETURN NEW;之前,我添加了...

NEW."PlaceId" = currval('"tbl_place_PlaceId_seq"');

【讨论】:

不确定这是否是并发安全的。在 Sql Server 中它不是。 Postgresql 没有相当于 SS 的 Scope_Identity 函数吗? 我想就是这样。它在这里说关于 currval,postgresql.org/docs/8.2/static/functions-sequence.html,“请注意,因为这是返回一个会话本地值,所以它给出了一个可预测的答案,无论其他会话自当前会话执行后是否已执行 nextval。”

以上是关于插入视图不返回主键的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis批量插入返回自增主键(转)

mybatis 实现 insert 语句返回 主键

Mybaits插入记录返回主键值

MyBatis批量插入返回主键报错

Mybatis 怎么返回insert插入的主键

mybatis批量插入,怎么返回生成的自增主键