【问题标题】:PostgreSQL Deferrable constraintsPostgreSQL 可延迟约束
【发布时间】:2020-04-19 05:44:59
【问题描述】:

在这部分代码中,我在表格中插入数据。

//some code...
const classIdArr = request.body.classIdArr;

await dbPool.query('BEGIN');
const result = await dbPool.query('Insert Into T_SUBJECT (NAME, NAME_ENG) Values ($1, $2) Returning ID', [subject.name, subject.name_eng]);

const subjectId = result.rows[0].id;

await Promise.all(classIdArr.map(async (classId) => {
    await dbPool.query('Insert Into T_BIND_SUBJECT_CLASS (CLASS_ID, SUBJECT_ID) Values ($1, $2)', [classId, subjectId]);
}));
await dbPool.query('COMMIT');

//some code...

T_BIND_SUBJECT_CLASS 有约束。有一个

...
CONSTRAINT t_bind_subject_class_fk_subject FOREIGN KEY (subject_id)
        REFERENCES public.t_subject (id) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE CASCADE
        DEFERRABLE INITIALLY DEFERRED
        NOT VALID
...

如果 classIdArr 的长度 === 1 没有问题,但如果 > 1 - postgreSQL 抛出错误:

在表上插入或更新 “t_bind_subject_class”违反外键约束 "t_bind_subject_class_fk_subject"

为什么?此约束为 DEFERRABLE INITIALLY DEFERRED。据我了解,这意味着所有检查都发生在事务结束时,但在这种情况下,它们是在第一次插入后检查的

请帮忙。谢谢!

【问题讨论】:

    标签: node.js postgresql pg


    【解决方案1】:

    您正在使用连接池,因此代码中的语句可能会使用不同的连接执行,即在不同的事务中。

    【讨论】:

    • 哦,在这种情况下我该怎么办?
    • 关注doc
    猜你喜欢
    • 2013-04-25
    • 1970-01-01
    • 2010-11-03
    • 2012-04-28
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2014-10-30
    相关资源
    最近更新 更多