是否有一种简单的方法(使用SQL查询或带有DAO记录集的VBA)在索引字段中交换两个值?在我的情况下,所述字段是小表的主键(预计不会超过30条记录)。预期的输入和输出如下。
在:
StageNumber | Description
------------+--------------------------
01 | First Thing
02 | Second Thing
后:
StageNumber | Description
------------+--------------------------
02 | First Thing
01 | Second Thing
我知道这看起来我只是简单地切换描述而不是StageNumber,但是StageNumber被用作另一个表中的外键,并且在关系中指定了级联更新,因此只需切换描述就会导致“子”记录与错误的“父母”联系在一起。
理想情况下,这可以通过单个UPDATE..SET
查询来实现,但就我而言,我无法弄清楚这种操作的语法是什么,而不会导致主键冲突错误。
答案 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更新为另一条记录的。