为什么我的值在数据库中按升序保存?

时间:2015-02-27 12:49:09

标签: php sorting pdo

我刚刚注意到我的rand值正在按升序(从低到高)保存,但我并没有告诉它以升序保存它。然而,当我回显兰德时,它以正常方式显示值。

源代码:

<?php
try {
  $db = new PDO('sqlite:randvalue.sqlite');
  $db->exec("CREATE TABLE company (revenue_value INTEGER PRIMARY KEY, month VARCHAR)");

  $i=1;
  while($i <= 12) {
    $randNum =  rand(1,100);
    $finalval = $randNum;
    $stmt = $db->prepare('INSERT INTO company (revenue_value) VALUES (?)');
    $stmt->execute(array("$finalval"));
    echo "$finalval";
    echo "<br>";
    $i++;
  };

  print "<table border=1>";
  print "<tr><td>value</td>";
  $result = $db->query('SELECT * FROM company');

  foreach($result as $row) {
    print "<tr><td>".$row['revenue_value']."</td>";
  }
  print "</table>";

  $db = NULL;

} catch(PDOException $e) {
  print 'Exception : '.$e->getMessage();
}
?>

结果:

enter image description here

如何使它不以非升序的方式保存表中的值,就像在值不是按升序排列的echo中一样?

2 个答案:

答案 0 :(得分:2)

数据库将尝试以最有效的方式存储行以进行快速查找。这意味着按照表的primary key定义的顺序存储它们(如果存在),在这种情况下,revenue_value列是主键。无法保证插入记录的顺序是执行SELECT时它们将返回的顺序。

如果你想在记录中拉回相同的顺序,你需要一个单独的列来存储它们的插入顺序。通常,您使用的AUTO_INCREMENT列也是表的主键。添加这样的列,您将能够使用ORDER BY子句按照插入顺序将它们拉回来。但是,正如我所说,数据库通常会尝试有效地存储行,无论如何它都是按主键列排序的,所以通常你不会需要 ORDER BY,但它是在结果顺序很重要的任何查询中包含一个仍然是一个好主意。

答案 1 :(得分:0)

感谢@Rizier设法找到问题

只需删除主键

即可
$db->exec("CREATE TABLE company (revenue_value INTEGER PRIMARY KEY, month VARCHAR)");

  $db->exec("CREATE TABLE company (revenue_value INTEGER, month VARCHAR)");