在索引字段中交换两个值

时间:2015-04-30 10:34:31

标签: sql vba ms-access

是否有一种简单的方法(使用SQL查询或带有DAO记录集的VBA)在索引字段中交换两个值?在我的情况下,所述字段是小表的主键(预计不会超过30条记录)。预期的输入和输出如下。

在:

 StageNumber | Description
 ------------+--------------------------
  01         | First Thing
  02         | Second Thing

后:

 StageNumber | Description
 ------------+--------------------------
  02         | First Thing
  01         | Second Thing

我知道这看起来我只是简单地切换描述而不是StageNumber,但是StageNumber被用作另一个表中的外键,并且在关系中指定了级联更新,因此只需切换描述就会导致“子”记录与错误的“父母”联系在一起。

理想情况下,这可以通过单个UPDATE..SET查询来实现,但就我而言,我无法弄清楚这种操作的语法是什么,而不会导致主键冲突错误。

2 个答案:

答案 0 :(得分:1)

这凸显了当存在身份变更风险时使用自然密钥作为主键的危险之一。

假设将来可能会有类似的变化,另一种方法是将新的Surrogate PK添加到Stage表(例如ID作为整数AUTONUMBER),然后:< / p>

  • 向引用StageId的所有表添加新的Stage外键列。
  • 然后更新StageId列,通过现有外键(StageId
  • 通过查找联接分配正确的StageNo
  • 然后将FOREIGN KEY约束放在引用表中的现有StageNumber外键列上。
  • PRIMARY KEY放在Stage.StageNumber上并将PK更改为Stage.Id
  • 然后在引用表中的新FOREIGN KEY外键列上重新添加StageId约束。

您现在可以自由更改StageNumber列的值,因为它不再是外键的一部分。

答案 1 :(得分:0)

将第一条记录的StageNumber更新为未使用的任意数字。

将第二条记录的StageNumber更新为第一条记录的。

将第一条记录的StageNumber更新为第二条记录的。

或者,分两步:

将StageNumbers更新为未使用的任意数字。

将两个StageNumbers更新为另一条记录的。