0

在 PostgreSQL 函数中,是否可以将 UNNEST 的结果(来自函数输入的整数数组)与从 CTE INSERT 返回的 ID 连接起来?

我有 PostgreSQL 表,例如:

CREATE TABLE public.message (
    id SERIAL PRIMARY KEY,
    content TEXT
);

CREATE TABLE public.message_tag (
    id SERIAL PRIMARY KEY,
    message_id INTEGER NOT NULL CONSTRAINT message_tag_message_id_fkey REFERENCES public.message(id) ON DELETE CASCADE,
    tag_id INTEGER NOT NULL CONSTRAINT message_tag_tag_id_fkey REFERENCES public.tag(id) ON DELETE CASCADE
);

我想创建一个 PostgreSQL 函数,该函数接受 的输入contenttag_id. 这是用于图形的。我想在一个函数中完成这一切,所以我得到了一个突变。

这是我到目前为止所得到的。我不知道如何UNNEST跨从 CTE 返回的 id 加入。

CREATE FUNCTION public.create_message(content text, tags Int[])
RETURNS public.message
AS $$

-- insert to get primary key of message, for many to many message_id
WITH moved_rows AS (
  INSERT INTO public.message (content)
  RETURNING *;
)

-- many to many relation
INSERT INTO public.message_tag
SELECT moved_rows.id as message_id, tagInput.tag_id  FROM moved_rows, UNNEST(tags) as tagInput;
RETURNING *

$$ LANGUAGE sql VOLATILE STRICT;
4

1 回答 1

1

你离你的目标并不远:

  • CTE 中的分号位置错误
  • 第一条INSERT语句缺少SELECTorVALUES子句来指定应该插入什么
  • INSERTintotag_message应该指定要插入的列(特别是如果你有那个不必要的serial id
  • UNNEST已经为调用指定了一个关系别名,但没有为该列指定一个关系别名tag_id
  • 您的函数是RETURNING一组message_tag行,但被指定为返回message单行

要修复这些:

CREATE FUNCTION public.create_message(content text, tags Int[])
RETURNS public.message
AS $$

-- insert to get primary key of message, for many to many message_id
WITH moved_rows AS (
  INSERT INTO public.message (content)
  VALUES ($1)
  RETURNING *
),
-- many to many relation
_ AS (
INSERT INTO public.message_tag (message_id, tag_id)
SELECT moved_rows.id, tagInput.tag_id
FROM moved_rows, UNNEST($2) as tagInput(tag_id)
)
TABLE moved_rows;

$$ LANGUAGE sql VOLATILE STRICT;

在线演示

于 2021-06-25T22:47:18.590 回答