0

删除某些值时,我需要选择哪些设置来维护有序队列。我创建带有自动增量和主键的 id 表。当我第一次插入值时没关系。就像1,2,3,4,5...删除某些值时,顺序会发生变化1,5,3...。而且脚本效果不好。

一些代码:

if(isset($submit)){

    if($pav2 == ""){
        header('Location: index.php');  
    }

    else {

    $select = mysql_query("SELECT new_id from naujiena ORDER by new_id");
    $zym = mysql_num_rows($select);

    if($zym == 0) {
    $query = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('1','$pav2')");
    header('Location: index.php');
    }

    else {
         $select2 = mysql_query("SELECT new_id from naujiena ORDER BY new_id DESC LIMIT 1");
         $max_public_id = mysql_fetch_row($select2);
         $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('$max_public_id[0]'+1,'$pav2')");

         header('Location: index.php');
    }

    }
}

当 new_pav 和 new_id 刚刚添加时: 示例:

new_id new_pav
5      some_value
4      some_value
3      some_value
2      some_value
1      some_value

当我删除某些内容时,它变成:例如:

new_id new_pav
4      some_value
2      some_value
3      some_value
1      some_value
4

1 回答 1

1

您在这里关心的是对数据库中的表是什么的常见误解。

当您从一个空白表开始并添加几行时,主键将为您提供一系列升序的唯一值。做一个简单的SELECT * FROM MyTable会给你这个:

MyTable
ID  other columns
1   row1
2   row2
3   row3
4   row4
5   row5

漂亮又漂亮,嗯?现在,当您从该表中删除行时,例如第 2 行和第 4 行,您会期望相同的选择为您提供:

MyTable
ID  other columns
1   row1
3   row3
5   row5

不幸的是,这不是它的工作原理,你可能会得到这个:

MyTable
ID  other columns
1   row1
5   row5
3   row3

没那么漂亮。原因很简单:当您运行SELECT * FROM MyTable查询时,查询返回的行的顺序是undefined。除非您指定特定的顺序,否则数据库可能会按照它想要的任何顺序给出 tham 。

如果您确实希望行具有某种一致的顺序,则需要这样说

SELECT * FROM MyTable ORDER BY id会给你你正在寻找的东西。

现在为什么它首先起作用?为什么在你删除东西之前这些行是完美的?它恰好是数据库可以从新表中检索数据的最有效顺序——仅此而已。如果数据库有任何更有效的方法来执行此操作,那么它首先会以不同的顺序开始。

编辑:事实证明,自从您进行编辑以来,您的问题与我最初的想法不同。您似乎担心当您删除具有最高 id 的行时,新行将获得相同的 id。那是因为你让整个事情变得比它需要的更复杂。

第 1 步:更改数据库

将您的new_id列设置INT AUTO_INCREMENT PRIMARY KEY为此SQL Fiddle中所示

第 2 步:将您的代码更改为(还修复了原始代码的 SQL 注入问题)

if(isset($submit)){

    if($pav2 == ""){
        header('Location: index.php');  
    }
    else {
         $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES (0,'". mysql_real_escape_string($pav2)."')");

         header('Location: index.php');
    }

    }
}
于 2013-03-10T12:13:58.457 回答