为什么 json_populate_record() 无法识别行类型?

Why is json_populate_record() not recognizing row type?

我有 2 tables typename。我试图通过一个函数用 json_populate_record() 插入这些。收到以下错误:

first argument of json_populate_record must be a row type

Table type 使用以下方法创建:

CREATE TABLE IF NOT EXISTS "type" (
  "id"    TEXT NOT NULL,
  "value" TEXT NOT NULL,
  PRIMARY KEY ("id"),
  CHECK ("id"<>'' AND "value"<>'')
);
CREATE INDEX IF NOT EXISTS "idx_type_value"
ON "type" ("value");


CREATE OR REPLACE FUNCTION "type_insertone" (
  IN _a JSON
) RETURNS VOID AS $$
BEGIN
  INSERT INTO "type" SELECT * FROM json_populate_record(NULL::"type", _a);
END;
$$ LANGUAGE plpgsql;

Table name 使用以下方法创建:

CREATE TABLE IF NOT EXISTS "name" (
  "id"    TEXT NOT NULL,
  "value" TEXT NOT NULL,
  PRIMARY KEY ("id"),
  CHECK ("id"<>'' AND "value"<>'')
);
CREATE INDEX IF NOT EXISTS "idx_name_value"
ON "name" ("value");


CREATE OR REPLACE FUNCTION "name_insertone" (
  IN _a JSON
) RETURNS VOID AS $$
BEGIN
  INSERT INTO "name" SELECT * FROM json_populate_record(NULL::"name", _a);
END;
$$ LANGUAGE plpgsql;

当用 {id: 'x', 'value': 'x'} 调用 type_insertone() 时,它起作用了。 但是当我用 name_insertone() 做同样的事情时,它不起作用!

我在想是否有可能在创建 table 之前创建函数,这可能导致它不知道 table name,但是我认为不是这样。

我不知道我应该在这里尝试什么。我还检查过 name 不是保留关键字, type.

也是

"name"是文本类型and a key word:

https://www.postgresql.org/docs/current/static/datatype-character.html 看底部,所以当您转换为 "name" 时,您转换为名称数据类型,而不是您的 table 行类型...

例如:

t=# alter table name rename to name1;
ALTER TABLE
t=# CREATE OR REPLACE FUNCTION "name_insertone" (
  IN _a JSON
) RETURNS VOID AS $$
BEGIN
  INSERT INTO "name1" SELECT * FROM json_populate_record(NULL::"name1", _a);
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
t=# select name_insertone('{"id": "x", "value": "x"}');
 name_insertone
----------------

(1 row)

还有:

t=# create table text(i int);
CREATE TABLE
t=# SELECT * FROM json_populate_record(NULL::"text", '{}')
t-# ;
ERROR:  first argument of json_populate_record must be a row type
t=# create table char(i int);
CREATE TABLE
t=# SELECT * FROM json_populate_record(NULL::"char", '{}');
ERROR:  first argument of json_populate_record must be a row type