我在 DB 上有一个表,其中包含以下字段作为 PK: DOC_ID
, SECTION_ID
, SET_ID
, CELL_ID
. 正如您可以推断的那样,这被称为一组 Excel 电子表格。
除了那些字段,我还有一个CELL_ROW
字段和CELL_COL
字段。使用SET_ID
( unique ),它们形成了一个替代键。
因此,至少在理论上,如果我想交换两个单元格的坐标,我需要释放该约束,或者使用第三个临时空闲位置(例如A100000)。
假设我有以下单元格:
DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL
--------|------------|--------|---------|----------|----------
5 | 456 | 8778 | 15045 | 5 | 4
5 | 456 | 8778 | 15048 | 5 | 5
并假设我有以下临时表,我从中执行UPDATE
到主表:
DOC_ID | SECTION_ID | SET_ID | CELL_ID | CELL_ROW | CELL_COL
--------|------------|--------|---------|----------|----------
5 | 456 | 8778 | 15045 | 5 | 5
5 | 456 | 8778 | 15048 | 5 | 4
从理论上讲,这UPDATE
应该引发一个例外......
但是刚刚试了一下,效果很好!
你能解释一下为什么吗?Oracle 是否将其作为原子操作执行,因此仅在整个操作之后检查约束(而不是每条记录的记录)?
MS SQL Server 2008 r2 和 Postgres 在这种情况下的表现如何?