PostgreSQL 可延迟约束

PostgreSQL Deferrable constraints

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

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

await dbPool.query('BEGIN');
const result = await dbPool.query('Insert Into T_SUBJECT (NAME, NAME_ENG) Values (, ) 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 (, )', [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 抛出错误:

insert or update on table "t_bind_subject_class" violates foreign key constraint "t_bind_subject_class_fk_subject"

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

请帮忙。谢谢!

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