【问题标题】:How can I update a MySQL natural key while avoiding duplicate foreign keys?如何在避免重复外键的同时更新 MySQL 自然键?
【发布时间】: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


【解决方案1】:
BEGIN TRANSACTION;
SET UNIQUE_CHECKS=0;
-- update 1
-- update 2
SET UNIQUE_CHECKS=1; 
COMMIT;

应该这样做。

【讨论】:

  • 我一直在尝试,但仍然出现重复错误。似乎 SET UNIQUE_CHECKS 不起作用。我首先开始在 PHP 中修改我的查询,然后尝试在 PHPMyAdmin 中播放。例子:#task id5 在位置 1 ,任务 id 41 在位置 2 START TRANSACTION; SET UNIQUE_CHECKS=0;更新任务 SET position = 2 WHERE id =5;更新任务 SET position = 1 WHERE id =41; SET UNIQUE_CHECKS=1;提交;
  • 在尝试在 mySQL 文档中查找更多信息后,我发现只有在您想要导入(插入)大量信息时才使用 SET UNIQUE_CHECKS=0。关闭它可以加快进程,因为 InnoDb 不会检查唯一性。但是他们没有说任何关于将它与更新一起使用的内容,所以您的代码可能实际上无法工作。你试过了吗?同时我会尝试使用 NullUserException 解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多