我有一个表格,其中每一行都有一个唯一的索引(1,2,3,…)。我想将每个条目的索引增加4,以便在开始时为四个新条目(索引1、2、3和4)留出空间。
我试过使用:
UPDATE table SET key_index = key_index + 4;
但它会导致一个错误,因为索引必须是唯一的(如前所述,将1乘以4将得到5)。索引5可能已经存在)。
如果我可以使用update语句,从底部开始(从最高索引到最低索引),那么就会出现这样的错误。有可能使用这样的update语句吗?
我有一个表格,其中每一行都有一个唯一的索引(1,2,3,…)。我想将每个条目的索引增加4,以便在开始时为四个新条目(索引1、2、3和4)留出空间。
我试过使用:
UPDATE table SET key_index = key_index + 4;
但它会导致一个错误,因为索引必须是唯一的(如前所述,将1乘以4将得到5)。索引5可能已经存在)。
如果我可以使用update语句,从底部开始(从最高索引到最低索引),那么就会出现这样的错误。有可能使用这样的update语句吗?
3条答案
按热度按时间uqjltbpv1#
这可能很棘手。我使用的一个技巧是两个更新——第一个是一系列“安全”的值。其次是所需值:
您还可以删除唯一索引/约束,或者在某些数据库中禁用它。
7gs2gvoe2#
如果您运行的是mysql,那么可以使用一个简单的
update
,带有order by
按降序值对行排序的子句。这使您可以在一个查询中执行更改,而不会有任何冲突的风险(因为您的值是唯一的)。mysql确实支持
order by
在update语句中,行为在文档中进行了描述如果
UPDATE
语句包括ORDER BY
子句中,行按子句指定的顺序更新。这在某些可能导致错误的情况下非常有用。文档中还有一个与您的用例非常相似的示例。
所以:
db小提琴演示:
zengzsys3#
戈登回答得恰到好处。但是,如果要更新key\索引,请记住还要更新外部引用表(如果有)中的值。
或者,您可以尝试另一种方法。添加另一列
dup_key_index
价值为key_index + 4
. 那就放下枪key_index
列并重命名此新列dup_key_index
作为key_index
列。sql fiddle演示
sql server:如果您使用的是sql server,引擎将在内部处理此问题,其中以下查询将工作:
参考这个。