Mysql配置/设置

时间:2013-03-10 11:57:33

标签: mysql key settings configure

删除某些值时,我需要选择哪些设置来维护有序队列。我使用自动增量和主键创建具有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

1 个答案:

答案 0 :(得分: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 。除非您指定某个订单,否则数据库可以在任何其想要的订单中提供。

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

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');
    }

    }
}