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"
为什么?此约束是可延迟的,最初是延迟的。据我了解,这意味着所有检查都发生在事务结束时,但在这种情况下,它们是在第一次插入后检查
请帮忙。谢谢!
您正在使用连接池,因此您代码中的语句可能会使用不同的连接执行,即在不同的事务中执行。
在这部分代码中,我在表中插入数据。
//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"
为什么?此约束是可延迟的,最初是延迟的。据我了解,这意味着所有检查都发生在事务结束时,但在这种情况下,它们是在第一次插入后检查
请帮忙。谢谢!
您正在使用连接池,因此您代码中的语句可能会使用不同的连接执行,即在不同的事务中执行。