首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql使用WITH和Ignore erros在多个表中插入

Postgresql使用WITH和Ignore erros在多个表中插入
EN

Stack Overflow用户
提问于 2021-03-01 22:58:13
回答 2查看 40关注 0票数 1

我的背景是MySQL,我正在学习PostgreSQL (版本12)。我使用Python3.7和Psycopg2将查询发送到数据库。我正在尝试以“级联”的方式将数据插入到多个表中。在下面的示例中,安全性

_

id是用于母数据之间关系的主键

_

安全性

_

id和子id

_

安全性

_

自动收报机表格和公司

_

母表名称列不重复

代码语言:javascript
运行
复制
WITH first_insert AS
        (
            INSERT INTO d_security_id
            (

                company_name
            )
            VALUES 
            (
            %s
            )
            ON CONFLICT DO NOTHING
            RETURNING security_id
        )
INSERT INTO d_security_ticker 
        (
            ticker,
            security_id
        )
    VALUES 
        (
            %s, (SELECT security_id FROM first_insert)
        )    
    ON CONFLICT DO NOTHING

插入重复单位时

_

名称时,它会触发一个错误,该错误由ON CONFLICT按预期处理。因此,为了安全起见,它返回一个None值

_

id (与预期一致)。这将在我的第二个insert语句上触发并出错,因为security

_

id不能为Null (定义为外键,但不能明确定义为not NULL fyi,以防万一)。从python脚本收到的错误为:

代码语言:javascript
运行
复制
psycopg2.errors.NotNullViolation: null value in column "security_id" violates not-null constraint

编写这个简单的insert查询等同于在MYSQl Tx和best中忽略的正确方法是什么

EN

Stack Overflow用户

发布于 2021-03-01 23:34:39

如果将查询更改为this,则在重复插入尝试时不会抛出错误。

代码语言:javascript
运行
复制
WITH first_insert AS (
        INSERT INTO d_security_id
        (company_name)
        VALUES ('the name')
        ON CONFLICT DO NOTHING
        RETURNING company_name, security_id
)
INSERT INTO d_security_ticker (ticker, security_id) (SELECT company_name, security_id FROM first_insert)
ON CONFLICT DO NOTHING;

这样,您只需要替换一次value参数。当条目存在时,select语句不返回任何行,因此在

语句。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66424409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档