我有一个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,但我找不到任何订单和更新列的内容。
答案 0 :(得分:1)
正如@KIKO Software所说,doc_number需要永久链接到原始源文档,因此内部控制目的有明确的审计跟踪。原因如下:
如果记录被删除'间隙'在doc_numbers中显示记录不连续并且存在问题。
列名doc_number还建议将其链接到另一个可能属于数据库外业务流程的文档。更新doc_number将使此关系无效。简而言之,不要更改doc_number。
如果在制作源文件时出现错误,请不要将其删除,但提出另一个反对文件以撤消错误,从而维护审计跟踪并反映& #39;正常业务'实践。
另见@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;