我的背景是MySQL,我正在学习PostgreSQL (版本12)。我使用Python3.7和Psycopg2将查询发送到数据库。我正在尝试以“级联”的方式将数据插入到多个表中。在下面的示例中,安全性
_
id是用于母数据之间关系的主键
_
安全性
_
id和子id
_
安全性
_
自动收报机表格和公司
_
母表名称列不重复
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脚本收到的错误为:
psycopg2.errors.NotNullViolation: null value in column "security_id" violates not-null constraint
编写这个简单的insert查询等同于在MYSQl Tx和best中忽略的正确方法是什么
发布于 2021-03-01 23:22:07
把第二个插入改成这样怎么样?
INSERT INTO d_security_ticker (ticker, security_id )
SELECT %s, fi.security_id
FROM first_insert fi
WHERE fi.security_id IS NOT NULL;
发布于 2021-03-01 23:34:39
如果将查询更改为this,则在重复插入尝试时不会抛出错误。
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语句不返回任何行,因此在
语句。
https://stackoverflow.com/questions/66424409
复制相似问题