【问题标题】:Mysql configure/settingsMysql 配置/设置
【发布时间】:2013-03-10 11:57:33
【问题描述】:

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

【问题讨论】:

  • 请添加表结构、示例数据、预期输出以及您卡在哪里。
  • 尝试使用 ROW_NUMBER() 函数而不是 id 请参考堆栈:stackoverflow.com/questions/1895110/row-number-in-mysql
  • "Select ROW_NUMBER(),other_column from table order by id " 在 DB 中,它仍将存储在 1,3,5 中,但是按顺序取 1,2,3

标签: mysql key settings configure


【解决方案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 查询时,查询返回的行的顺序是未定义。除非您指定特定的顺序,否则数据库可能会以它想要的任何顺序给它。

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

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

    }
}

【讨论】:

  • $select2 = mysql_query("SELECT new_id from naujiena ORDER BY new_id DESC LIMIT 1"); if (mysql_num_rows($select2) > 0) { $max_public_id = mysql_fetch_row($select2); $query2 = mysql_query("INSERT INTO naujiena (new_id,new_pav) VALUES ('$max_public_id[0]'+1,'$pav2')"); } 我的代码是。
  • @user2149578 该代码比它需要的复杂。只需将 new_id 列更改为 AUTO_INCREMENT,然后插入 0 - 无需事先选择。然后数据库会自动选择一个新的 id。
  • 请编辑您的原始问题,并添加更多详细信息来描述您的问题。
  • Hazzit,你的想法很好,但实际上我需要检查数据库中是否已经存在某些值。如果不是,我分配 id = 1 否则我检查最后一个 id 编号并再添加一个 (+1)。
  • @user2149578 不,你没有。数据库将为您执行此操作。
猜你喜欢
  • 2014-12-30
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-06
  • 2013-07-22
  • 2015-09-01
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多