订购数据库表,然后为列编号

时间:2017-08-28 07:21:54

标签: php mysql

我有一个mysql表,用于会计文档。该表看起来像:

  id  | doc_number |    doc_date
------|------------|-----------------
  24  |     24     |    1501061817
  25  |     25     |    1501750532
  26  |     26     |    1501750457

让我们想象一下,我们删除了一个doc_number为25的记录。所以现在doc_numbers是..,21,22,23,24,26,27,......这是一件坏事,24岁以后我们有26而不是25.

通过时间会计文档将添加到表中并从表中删除,doc_number必须是连续的。

由于某些原因,我必须编写一个同步docnumbers的php方法。答案很简单:

public function sync(){
  $sql = "SELECT id FROM acc_docs ORDER BY doc_date ASC, id DESC";
  $array = DB::run_query($sql); //a method that runs a query and returns the result as an array of objects
  foreach($array as $key => $object){
    $sql = "UPDATE acc_docs SET doc_number=".($key+1)." WHERE id=".$object->id;
    DB::execute_query($sql); // a method that executes sql queries
  }
}



很明显,这不是一个好习惯。为此目的,最佳做法是什么?编写对表进行排序然后对列进行编号的方法的最佳方法是什么?我用Google搜索并发现了很好的问题,例如this,但我找不到任何订单和更新列的内容。

2 个答案:

答案 0 :(得分:1)

正如@KIKO Software所说,doc_number需要永久链接到原始源文档,因此内部控制目的有明确的审计跟踪。原因如下:

  1. 如果记录被删除'间隙'在doc_numbers中显示记录不连续并且存在问题。

  2. 列名doc_number还建议将其链接到另一个可能属于数据库外业务流程的文档。更新doc_number将使此关系无效。简而言之,不要更改doc_number。

  3. 如果在制作源文件时出现错误,请不要将其删除,但提出另一个反对文件以撤消错误,从而维护审计跟踪并反映& #39;正常业务'实践。

  4. 另见@ADyson的有用讨论。

答案 1 :(得分:0)

听起来你想要的只是表ID的连续数字顺序。这引出了一个问题,为什么你要将它存储在数据库中,而不是在你选择时始终正确地生成它?

SET @doc_number=0;
SELECT ID, @doc_number:=@doc_number+1 AS doc_number, doc_date
  FROM acc_docs
  GROUP BY ID
  ORDER BY ID DESC;