在不更改列内容的情况下将+1增加到id

时间:2013-05-24 19:25:53

标签: sql oracle primary-key uniqueidentifier primary-key-design

我有随机内容的随机表。

  

id |名称|使命
  1 | aaaa | kitr
  2 | bbbb | ETRE
  3 | CCCCC | qwqw
  4 | dddd | QWERT
  5 | eeee |势
  6 | ffffffff | TOTO
  

我想要的是在上面的表中添加一个id = 3的列,其中包含不同的名称和不同的任务但是OLD id = 3我想要一个id = 4,其中包含之前的名称和任务它是id = 3,OLD id = 4变为id = 5,其名称和任务为id 5,依此类推。
它就像我想要在列内部和列下面输入一列我希望增加id +1但是列保持相同。以下示例:


  

id |名称|使命
  1 | aaaa | kitr
  2 | bbbb | ETRE
   3 | ZZZZZZ | ZZZZZ
  4 | CCCCC | qwqw
  5 | dddd | QWERT
  6 | eeee |势
  7 | ffffffff | TOTO
  

为什么我要这样做?我有一个有2个CLOB的表。在那些CLOBS里面有不同的查询ex:id = 1有clob创建表id = 2插入列id = 3创建另一个表id = 4有函数
如果你在一个文本(或clob)中添加所有这个id,他们将必须创建然后插入然后创建然后函数。那张桌子就像一个巨大的剧本。
为什么我这样做?开发人员正在构建他们的应用程序,他们希望sql按特定顺序工作,我有6个开发人员,正在组织数据建模和性能以及脚本的运行方式。所以上表是组织调用脚本他们不知道

2 个答案:

答案 0 :(得分:7)

简单地说,不要这样做。

这个案例强调了为什么你永远不应该使用任何商业价值,即主键的任何“真实世界价值”。

在您的情况下,我会建议不将主键用于任何其他目的。 我建议您添加一个额外的列'order',然后更改THAT列以重新排序行。这样就不需要触摸主键和所有其他记录了。

这可以避免您的方法需要更改当前记录下方的所有数据库记录的问题,这似乎是一种非常糟糕的方法。试想想要撤消更新;)

此处提供更多信息:https://stackoverflow.com/a/8777574/631619

答案 1 :(得分:1)

UPDATE random_table r1
SET id =
  (SELECT CASE WHEN id > 2 THEN id+1 ELSE id END id FROM random_table r2
  WHERE r1.mission=r2.mission
  )

然后插入新值。