Consise重新排序主SQL键的方法

时间:2015-05-28 02:58:49

标签: php mysql sql

解决了我在底部的解决方案

我正在研究一个使用SQL表的主键来排序的系统。我正在尝试在UI中添加该功能以重新排序此排序。

理想情况下,我想要一个简洁而有效的通用解决方案,不会涉及重复整个表格。我也希望解决方案不要求重写整个系统以尽可能使用不同的密钥/ id。

我提出的最佳(在我看来)解决方案似乎不起作用,我无法弄清楚原因。

$old_ids = $_POST["oldid"];
$new_ids = $_POST["newid"];
$i = 0;
foreach ($old_ids as $oid) {
    $nid = $new_ids[$i];
    $db->insert("UPDATE links SET sort = $oid WHERE id = $oid");
    $db->insert("UPDATE links SET id = -$nid WHERE sort = $oid");
    $i++;
}
$i = 0;
foreach ($old_ids as $oid) {
    $nid = $new_ids[$i];
    $db->insert("UPDATE links SET id = $nid WHERE id = -$oid");
    $i++;
}
$db->insert("UPDATE links SET sort = NULL");

当将顶行(第1行)移动到底部(第6行)时,PHP输出SQL

UPDATE links SET sort = 2 WHERE id = 2;
UPDATE links SET id = -1 WHERE sort = 2;
UPDATE links SET sort = 3 WHERE id = 3;
UPDATE links SET id = -2 WHERE sort = 3;
UPDATE links SET sort = 4 WHERE id = 4;
UPDATE links SET id = -3 WHERE sort = 4;
UPDATE links SET sort = 5 WHERE id = 5;
UPDATE links SET id = -4 WHERE sort = 5;
UPDATE links SET sort = 6 WHERE id = 6;
UPDATE links SET id = -5 WHERE sort = 6;
UPDATE links SET sort = 1 WHERE id = 1;
UPDATE links SET id = -6 WHERE sort = 1;
UPDATE links SET id = 1 WHERE id = -2;
UPDATE links SET id = 2 WHERE id = -3;
UPDATE links SET id = 3 WHERE id = -4;
UPDATE links SET id = 4 WHERE id = -5;
UPDATE links SET id = 5 WHERE id = -6;
UPDATE links SET id = 6 WHERE id = -1

当我在phpmyadmin中运行它时,所有ID都重置为默认的1-6(正)值,我收到以下错误

UPDATE links SET id = -5 WHERE sort = 6;
#1062 - Duplicate entry '-5' for key 'PRIMARY'

我还没有看到任何似乎以高效或简洁的方式解决密钥重复问题的任何事情。如果没有特别简洁或有效的方法来解决这个问题,那么最有效的方法是什么?

我觉得我忽略了一些显而易见的事情,但我还没有找到解决方案。如何完成我需要的任何帮助或见解将不胜感激。几个小时以来,我一直在抨击我。

解决方案

所以这就是我想出来的,似乎达到了我想要的目的。

$old_ids = $_POST["oldid"];
$new_ids = $_POST["newid"];
$i = 0;
$db->insert("ALTER TABLE links CHANGE id id INT(255) NOT NULL");
foreach ($old_ids as $oid) {
    $nid = $new_ids[$i];
    $db->insert("UPDATE links SET id = -$nid WHERE id = $oid");
    $i++;
}
foreach ($old_ids as $oid) {
    $db->insert("UPDATE links SET id = $oid WHERE id = -$oid");
}
$db->insert("ALTER TABLE links CHANGE id id INT(255) NOT NULL AUTO_INCREMENT");

诀窍是暂时在AUTO_INCREMENT列上切换id。除此之外,我意识到根本不需要专门的sort列。

显然这需要一些错误处理,但我希望切换AUTO_INCREMENT,将新的id值设置为负值,迭代通过将它们反转为正数的一般想法将有助于某人面对同样的问题问题

1 个答案:

答案 0 :(得分:0)

所以这就是我想出来的,似乎达到了我想要的目的。

$old_ids = $_POST["oldid"];
$new_ids = $_POST["newid"];
$i = 0;
$db->insert("ALTER TABLE links CHANGE id id INT(255) NOT NULL");
foreach ($old_ids as $oid) {
    $nid = $new_ids[$i];
    $db->insert("UPDATE links SET id = -$nid WHERE id = $oid");
    $i++;
}
foreach ($old_ids as $oid) {
    $db->insert("UPDATE links SET id = $oid WHERE id = -$oid");
}
$db->insert("ALTER TABLE links CHANGE id id INT(255) NOT NULL AUTO_INCREMENT");

诀窍是暂时在AUTO_INCREMENT列上切换id。除此之外,我意识到根本不需要专门的sort列。

显然这需要一些错误处理,但我希望切换AUTO_INCREMENT,将新的id值设置为负值,迭代通过将它们反转为正数的一般想法将有助于某人面对同样的问题问题