我有一张标题为KEYS
的表格,如下所示。 id
和version
列都是主键。
|| 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数据库。
答案 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严重减慢。