簡體   English   中英

使用 SQL UPDATE 語句時如何更改更新順序?

[英]How to change the update order while using the SQL UPDATE statement?

我有一個表,其中每一行都用唯一索引(1,2,3,...)編號。 我想將每個條目的索引增加 4,以便在開頭為四個新條目騰出空間(索引 1、2、3 和 4)。

我嘗試使用:

UPDATE table SET key_index = key_index + 4;

但它會導致錯誤,因為如前所述,索引必須是唯一的(將 1 增加 4 會導致 5。索引 5 可能已經存在)。

如果我可以使用 UPDATE 語句,從底部開始(從最高到最低索引),那么就會有這樣的錯誤。 是否可以使用這樣的 UPDATE 語句?

這可能很棘手。 我使用的一個技巧是兩次更新——首先是一系列“安全”的值。 其次是期望值:

update t
    set key_index = - key_index ;

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

您還可以刪除唯一索引/約束——或在某些數據庫中禁用它。

如果您正在運行 MySQL,則可以使用簡單的update ,並帶有一個order by子句,該子句按降序對行進行排序。 這使您可以在一個查詢中執行更改,而沒有任何沖突的風險(因為您的值是唯一的)。

MySQL 確實支持在更新語句中order by ,並且該行為在文檔中進行了描述

如果UPDATE語句包含ORDER BY子句,則按該子句指定的順序更新行。 這在某些可能會導致錯誤的情況下很有用。

文檔繼續提供一個看起來就像您的用例的示例。

所以:

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

DB Fiddle 上的演示

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        |

戈登中肯地回答。 但是,如果您要更新 key_index,請記住還要更新外部引用表中的值(如果有)。

或者,您可以嘗試另一種方法。 添加另一列dup_key_index ,其值為key_index + 4 然后刪除key_index列並將這個新列dup_key_index重命名為key_index列。

SQL 小提琴演示

# 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 服務器:如果您使用的是 SQL 服務器,引擎會在內部處理以下查詢:

update TABLE_NAME set key_index = key_index + 4;

參考這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM