[英]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;
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
列。
# 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.