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