从 postgres 中的对象数组插入唯一值
Insert unique values from array of objects in 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;
请注意,对于作为 jsonb 数组传递的所有代码,将插入相同的 "id"
。如果它是主键,您应该分别为每个代码生成 "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;
很难理解您要做什么。也许是这样:
CREATE OR REPLACE FUNCTION "InsertCodes" (
"@codes" JSONB,
"@type" TEXT
)
RETURNS void AS
$func$
DECLARE "id" UUID;
BEGIN
"id" = uuid_generate_v4();
with c("code", "name") as
(
SELECT codes->>'code', codes->>'name'
FROM jsonb_array_elements("@codes") t(codes)
)
-- fails below
INSERT INTO
"codes" (
"id",
"code",
"name",
"type"
)
select
"id",
c."code",
c."name",
"@type"
from c
ON CONFLICT ON CONSTRAINT "code"
DO NOTHING;
END;
$func$ LANGUAGE PLPGSQL;
我一直在尝试从一组对象中将一组唯一代码输入到 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;
请注意,对于作为 jsonb 数组传递的所有代码,将插入相同的 "id"
。如果它是主键,您应该分别为每个代码生成 "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;
很难理解您要做什么。也许是这样:
CREATE OR REPLACE FUNCTION "InsertCodes" (
"@codes" JSONB,
"@type" TEXT
)
RETURNS void AS
$func$
DECLARE "id" UUID;
BEGIN
"id" = uuid_generate_v4();
with c("code", "name") as
(
SELECT codes->>'code', codes->>'name'
FROM jsonb_array_elements("@codes") t(codes)
)
-- fails below
INSERT INTO
"codes" (
"id",
"code",
"name",
"type"
)
select
"id",
c."code",
c."name",
"@type"
from c
ON CONFLICT ON CONSTRAINT "code"
DO NOTHING;
END;
$func$ LANGUAGE PLPGSQL;