postgresql - 从 postgres 中的对象数组中插入唯一值
问题描述
我一直在尝试将一组唯一代码从一组对象输入到 postgres 中。这是我到目前为止所拥有的,但它在INTO附近不断失败。我之前尝试过循环版本,但它从未插入任何内容,但也不会产生错误。下面将是理想的批量插入,无需任何 FOR 循环。
CREATE OR REPLACE FUNCTION "InsertCodes" (
"@codes" JSONB,
"@type" TEXT
)
RETURNS void AS
$func$
DECLARE "id" UUID;
BEGIN
"id" = uuid_generate_v4();
SELECT * FROM (
SELECT *
FROM jsonb_array_elements("@codes")
) AS c (
-- fails below
INSERT INTO
"codes" (
"id",
"code",
"name",
"type"
)
VALUES (
"id",
c."code",
c."name",
"@type"
);
ON CONSTRAINT ("code")
DO NOTHING
RETURNING 1;
);
END;
$func$ LANGUAGE PLPGSQL;
@codes
如下所示:
[
{
"code": 1234,
"name": "numeric"
},
{
"code": "1k1l2k",
"name": "alphanumeric"
}
]
解决方案
查询应如下所示:
"id" = uuid_generate_v4();
INSERT INTO "codes" ("id", "code", "name", "type")
SELECT "id", item->>'code', item->>'name', "@type"
FROM jsonb_array_elements("@codes") AS item
ON CONFLICT ("code") DO NOTHING;
请注意,"id"
对于作为 jsonb 数组传递的所有代码,都将插入相同的内容。如果它是主键,您应该"id"
分别为每个代码生成:
INSERT INTO "codes" ("id", "code", "name", "type")
SELECT uuid_generate_v4(), item->>'code', item->>'name', "@type"
FROM jsonb_array_elements("@codes") AS item
ON CONFLICT ("code") DO NOTHING;
推荐阅读
- r - 如何在y轴左侧制作geom_text
- swift - 在 Xcode 中,自动补全建议被划掉是什么意思?
- excel - VBA 新手,在 Ranges 中苦苦挣扎
- jwt - 我无法添加 3 个参数来使用 LexikJWTAuthenticationBundle 和 Symfony 进行身份验证和生成令牌
- github - 如何通过 github-api 获得提交计数?
- docker - .net core(system.drawing.common) 无法在 linux docker 容器上呈现中文和阿拉伯字体
- r - 如何将一列数据转换为 R 中的字节?
- wordpress - 在 WordPress 仪表板中制作自定义列以进行自定义分类 SORTABLE
- r - 在 RStudio 中,这行代码出现两个错误。有人可以帮我找出问题所在吗?我给了代码表格开始
- jquery - SweetAlert2 行为与 Jquery 的 keydown