一次移动多行的主键

时间:2014-07-18 18:42:47

标签: sql ms-access oledb

我有一张标题为KEYS的表格,如下所示。 idversion列都是主键。

||  id* |  version* |  value  ||
--------------------------------
||  1   |     1     | "asdf"  ||
||  1   |     2     | "jkl;"  ||
||  1   |     3     | "qwerty"||
--------------------------------

我想在版本1和版本2之间插入一行,以便它看起来像这样:

||  id* |  version* |  value  ||
--------------------------------
||  1   |     1     | "asdf"  ||
||  1   |     2     | "zxcv"  ||  <--
||  1   |     3     | "jkl;"  ||
||  1   |     4     | "qwerty"||
--------------------------------

请注意,"jkl;""qwerty"行的version值增加了1.我尝试了以下查询将版本号增加1,但查询错误因为版本2无法递增,因为它会与版本3冲突:

UPDATE KEYS SET version=version+1 WHERE id = 1 AND version >= 2

有没有人可以在增加其他行的版本时插入新行?

注意:我通过c ++应用程序中的OleDB驱动程序连接到MS Access数据库。

2 个答案:

答案 0 :(得分:3)

这是使用匿名主键而非复合主键的另一个好理由。但是,那是你的结构。

一种方法是将id重新分配给非感知值,然后分配回来:

UPDATE KEYS
    SET id = -1, version = version + 1
    WHERE id = 1 AND version >= 2;

UPDATE KEYS
    SET id = 1
    WHERE id = -1;

一个价格的两次更新!

答案 1 :(得分:1)

不,你真的只需要使用两个单独的陈述:

UPDATE KEYS SET version = version + 1 WHERE id = 1 AND version >= 2

然后执行:

INSERT INTO KEYS (id, version, value) VALUES (1, 2, 'zxcv')

如果您可以更改数据库结构,我建议使用除了提供与其他表的关系之外没有任何值的单个主键字段。处理大量数据时,复合键可能会导致MS Access严重减慢。