【发布时间】:2012-03-28 18:51:44
【问题描述】:
事情是这样的:
我有一个使用 jQuery/php/mysql 构建的 webapp。这是一个任务管理器。我有属于类别的类别和任务。任务有一个代理主键(自动增量 id),为了数据库一致性,我有一个自然键(唯一),如下所示:(id_category,位置)
当用户移动任务时,我必须更新该任务在 DB 中的位置(ajax 请求),以及与更改相关的所有其他任务的位置。例如,如果您将位置为 5 的给定任务上移至位置 2,则位置从 4 到 2 的任务的位置必须增加 1。 (这是我的方法;我知道有些人会发送给定类别的整个任务集以及新职位,但我试图只更新需要更新的任务)
问题是我不知道如何在不避免自然键中出现重复错误的情况下更新任务的位置,因为我不能/不知道如何同时更新所有内容。
那么你能帮我解决这个问题吗,或者我应该改变我的方法。我可以删除唯一索引(自然键),但数据库一致性机制有一些用途......
感谢您的帮助。
【问题讨论】:
-
当你有 autoinc 键时,为什么还需要你的自然键?它有什么用途?
-
在您的示例中,您可以执行以下操作:
UPDATE table SET position = -1 WHERE position = 5; UPDATE table SET position = position + 1 WHERE position < 5 AND position > 1; UPDATE table SET position = 2 WHERE position = -1(假设 -1 是一个永远不会使用的位置) -
@TobyAllen 用于数据库一致性。两个任务不能在同一类别中的同一位置。在我构建应用程序时,有时会发生这种情况,因为我没有检查某些条件。
-
我做过类似的事情(但没有ajax),我会尝试记住并发布。
-
@Amida 如果您使用交易,则不会。
标签: mysql duplicates natural-key