【发布时间】:2018-02-05 09:52:55
【问题描述】:
我有一个为会计文件制作的 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 必须是连续的。
由于某些原因,我必须编写一个同步 doc_numbers 的 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
}
}
很明显,这不是一个好习惯。为此目的的最佳做法是什么?编写对表进行排序然后对列进行编号的方法的最佳方法是什么?我搜索了它并找到了像this 这样的好问题,但我找不到任何既可以订购又可以更新专栏的东西。
【问题讨论】:
-
我看不出存储这些信息的意义
-
如果
id是主键,那么重新索引将来会给你带来很大的问题(当其他一些表将使用这个id作为foreign key时) -
这里有矛盾。
doc_number可能出于某种原因必须是连续的,检查是否没有删除或添加任何文档。现在你想故意打破这个? PS:如果你想要 doc_number,你可以简单地问:SELECT COUNT(*) FROM acc_docs WHERE id <= targetId。日期似乎与订购无关? -
答案在您发布的链接中。也阅读 cmets。但就像草莓说的那样,这有什么意义呢? @AlivetoDie 这不是关于 id,而是关于 doc_number。
-
这里有一个选项:删除文档记录时只需进行软删除。现在,一切都是连续的,但你仍然知道删除了什么。或者,在查询时使用会话变量生成序列。