【发布时间】:2013-02-26 12:12:05
【问题描述】:
我在 DB 上有一个表,其中包含以下字段作为 PK:DOC_ID、SECTION_ID、SET_ID、CELL_ID。正如您所推断的,这指的是一组 Excel 电子表格。
除了这些字段之外,我还有一个CELL_ROW 字段和CELL_COL 字段。
使用SET_ID(唯一),它们形成了一个替代键。
因此,至少在理论上,如果我想交换两个单元格的坐标,我需要释放该约束,或者使用第三个临时空闲位置(例如 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 在这种情况下的表现如何?
【问题讨论】:
标签: sql-server-2008 postgresql oracle10g sql-update unique-constraint