首页 > 解决方案 > 插入后跟删除查询

问题描述

我想先在我的表上应用删除查询,然后在同一张表上应用插入查询。

variable_page_category 表有 2 列(page_category_id,variable_id)。它是一个复合主键。

我的表可以是这样的:

page_category_id  | 1  2  3  4  5
variable_id       | 1  1  1  2  2
result_variable_page_category_delete AS (
        DELETE FROM common.variable_page_category
        WHERE variable_id = (dynamic_variable_json->>'id')::BIGINT
        RETURNING 1
    ),
    result_variable_page_category AS (
        INSERT INTO common.variable_page_category (page_category_id, variable_id)
        SELECT
            (page_category_id::TEXT)::BIGINT,
            (dynamic_variable_json->>'id')::BIGINT
        FROM jsonb_array_elements_text((dynamic_variable_json->>'page_category_id')::JSONB) AS page_category_id
        RETURNING 1
    )

但这没有按顺序执行,我收到了这个错误。这两个查询都是正确的。

ERROR: duplicate key value violates unique constraint \"variable_page_category_pkey\"\n Detail: Key (page_category_id, variable_id)=(1, 1) already exists.

如何结合这两个查询,以便在插入之前完成删除查询?更新查询也是一种选择,但因为我是新手,我无法轻松处理更新查询,这就是为什么首先尝试这种方法的原因。

标签: sqlpostgresqlstored-proceduressql-insertsql-delete

解决方案


为什么不简单地使用 ? 连接两个查询;

DELETE FROM common.variable_page_category
        WHERE variable_id = (dynamic_variable_json->>'id')::BIGINT
;
INSERT INTO common.variable_page_category (page_category_id, variable_id)
        SELECT
            (page_category_id::TEXT)::BIGINT,
            (dynamic_variable_json->>'id')::BIGINT
        FROM jsonb_array_elements_text((dynamic_variable_json->>'page_category_id')::JSONB) AS page_category_id

您可能希望根据您的客户端配置添加事务


推荐阅读