如何在使用SQLUPDATE语句时更改更新顺序?

cyvaqqii  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(566)

我有一个表格,其中每一行都有一个唯一的索引(1,2,3,…)。我想将每个条目的索引增加4,以便在开始时为四个新条目(索引1、2、3和4)留出空间。
我试过使用:

UPDATE table SET key_index = key_index + 4;

但它会导致一个错误,因为索引必须是唯一的(如前所述,将1乘以4将得到5)。索引5可能已经存在)。
如果我可以使用update语句,从底部开始(从最高索引到最低索引),那么就会出现这样的错误。有可能使用这样的update语句吗?

uqjltbpv

uqjltbpv1#

这可能很棘手。我使用的一个技巧是两个更新——第一个是一系列“安全”的值。其次是所需值:

update t
    set key_index = - key_index ;

update t
    set key_index = (- key_index) + 4;

您还可以删除唯一索引/约束,或者在某些数据库中禁用它。

7gs2gvoe

7gs2gvoe2#

如果您运行的是mysql,那么可以使用一个简单的 update ,带有 order by 按降序值对行排序的子句。这使您可以在一个查询中执行更改,而不会有任何冲突的风险(因为您的值是唯一的)。
mysql确实支持 order by 在update语句中,行为在文档中进行了描述
如果 UPDATE 语句包括 ORDER BY 子句中,行按子句指定的顺序更新。这在某些可能导致错误的情况下非常有用。
文档中还有一个与您的用例非常相似的示例。
所以:

UPDATE table SET key_index = key_index + 4 ORDER BY id DESC;

db小提琴演示:

create table mytable (key_index int);
insert into mytable values (1), (4), (5), (8), (9);

update mytable 
set key_index = key_index + 4
order by key_index desc;

select * from mytable;

| key_index |
| --------- |
| 5         |
| 8         |
| 9         |
| 12        |
| 13        |
zengzsys

zengzsys3#

戈登回答得恰到好处。但是,如果要更新key\索引,请记住还要更新外部引用表(如果有)中的值。
或者,您可以尝试另一种方法。添加另一列 dup_key_index 价值为 key_index + 4 . 那就放下枪 key_index 列并重命名此新列 dup_key_index 作为 key_index 列。
sql fiddle演示


# Add new column to hold the key_index value

alter table TABLE_NAME add dup_key_index int not null;

# Update this columns value from the key_index value and increment

update TABLE_NAME set dup_key_index = key_index + 4;

# Drop the key_index

alter table TABLE_NAME drop key_index;

# Rename the new column with same name as key_index

alter table TABLE_NAME change dup_key_index key_index int primary key;

sql server:如果您使用的是sql server,引擎将在内部处理此问题,其中以下查询将工作:

update TABLE_NAME set key_index = key_index + 4;

参考这个。

相关问题