我有這樣的表結構:MySQL的更新SORT_ORDER具有唯一約束的領域導致違反唯一約束
表1:id, group_id, label, sort_order
鍵:PK: id, UNIQUE: group_id+sort_order, INDEX: group_id
的樣本數據:
id group_id label sort_order
50 1 Field 1 1
51 1 Field 2 2
52 1 Field 3 3
凡(group_id, sort_order)
是一個獨特的關鍵。
要更新前端記錄的排列,按條目按順序使用sort_order
字段。用戶可以通過在前端拖動標籤來更新訂單,該標籤通過ID,例如:52, 51,50
,然後將其視爲新訂單/排序。
預期的結果:
id group_id label sort_order
50 1 Field 1 3
51 1 Field 2 2
52 1 Field 3 1
過程中應與新sort_order
值更新所有3條記錄。樣品更新查詢:
UPDATE Table1 SET sort_order = 1 WHERE id = 52 AND group_id = 1
然而,由於排序順序是唯一鍵的一部分,因爲group_id,sort_order
鍵已經存在拋出錯誤。
我做了一個駭人的解決方法,我更新了排序順序兩次,例如:將其更新爲更高的值,例如:sort_order = actual_order + 1000
然後使用實際值再次更新,例如:sort_order = actual_order
。
什麼是更好的方法?我應該完全刪除唯一的密鑰嗎?
-
編輯
-
爲了給問題的一個更好的視野,這裏是我的PHP代碼:
樣品fieldIds:52,51,50
或50,51,52
或51,52,50
。序列決定了新的排序。
public function updateSort($projectId, $groupId, $subgroupId, array $fieldIds)
{
// Other stuff
// ...
$statement = create_a_prepared_statement(); // ...
// Updating sort_order directly would result to unique key violation
// so change the sort_order into some negative numbers and re-sort with
// the actual orders
foreach ($fieldIds as $sortIndex => $fieldId) {
$sort = $sortIndex - 1000;
$statement->execute(array(
'id' => $fieldId,
'project_id' => $projectId,
'group_id' => $groupId,
'subgroup_id' => $subgroupId,
':0' => $sort,
));
}
// Now sort it correctly
foreach ($fieldIds as $sortIndex => $fieldId) {
$sort = $sortIndex + 1;
$statement->execute(array(
'id' => $fieldId,
'project_id' => $projectId,
'group_id' => $groupId,
'subgroup_id' => $subgroupId,
':0' => $sort,
));
}
return true;
}
是否有一個原因,您不能將sort_order移出PK,並將實際的唯一ID放在那裏? –
你的破解是一個合理的方法。我通常使用負值,所以如果出現問題,它們立即顯而易見。另一種可能性是使用NULL值。 –
@MutuYolbulan。 。 。 OP聲明,這個組合是一個*唯一*鍵,而不是*主鍵*。我猜想'id'是主鍵。 –