这是一个愚蠢的问题,但我从来没有得到过直接答案。
假设我有一个包含以下字段和值的数据库表:
| id | date_added | balance |
+------------------------------------+
| 1 | 2009-12-01 19:43:22 | 1237.50 |
| 2 | 2010-01-12 03:19:54 | 473.00 |
| 3 | 2010-01-12 03:19:54 | 2131.20 |
| 4 | 2010-01-20 11:27:31 | 3238.10 |
| 5 | 2010-01-25 22:52:07 | 569.40 |
+------------------------------------+
这是一个非常基本的“会计”子系统。我想获得最新的余额。 id
字段设置为auto_increment。通常,我会使用:
SELECT balance FROM my_table ORDER BY date_added DESC LIMIT 1;
但我需要让完全确定返回的值是最新的...(请参阅上面的ID#2& 3)
1)我会更好地使用:
SELECT balance FROM my_table ORDER BY id DESC LIMIT 1;
2)或者这是一个更好的解决方案吗?:
SELECT balance FROM my_table ORDER BY date_added,id DESC LIMIT 1;
AFAIK,auto_increment
效果很好,但它是否足够可靠,可以对这个至关重要的东西进行排序?这就是为什么我认为按两个字段进行排序是一个更好的主意,但是当我在过去这样做时,我在MySQL中看到了一些非常古怪的行为。或者,如果有更好的解决方案,我将非常感谢您的意见。
提前致谢!
布赖恩
答案 0 :(得分:9)
如果 有机会在同一日期添加两个,您可能需要:
SELECT balance FROM my_table ORDER BY date_added DESC,id DESC LIMIT 1;
(注意两个字段的'descending'子句。)
但是,当有人添加2月2 nd 的调整条目时,你需要考虑你想要发生的事情,该日期为31 st 1月确保1月份完成。它的ID将大于2月1 st 的ID。
通常,会计系统只适用于该日期。也许如果您能告诉我们为什么订单很重要,我们可以提出其他建议。
回应你的评论:
我很想听到你可能有的任何其他想法或建议,即使他们不在话题,因为我对会计型数据库模型一无所知。
我会提供一些建议 - 这是我能立刻想到的,我通常会用更少的鼓励来发出更多的“建议”:-)前两个,更多的数据库相关而不是会计相关的,是:
首先,以第三范式执行所有,只有在遇到性能问题时才会恢复。这将为您节省大量的焦虑,重复数据可能会失去一步。即使您确实还原,也可以使用触发器和其他DBMS功能来确保数据不会失控。
例如,如果要加快对last_name列的搜索速度,可以创建upper_last_name列(已编制索引),然后使用该列查找与您已经在大写的搜索词匹配的记录。这几乎总是比每行函数upper(last_name)
更快。您可以使用插入/更新触发器来确保始终正确设置upper_last_name,这仅在名称更改时产生成本,而不是每次搜索时都会产生成本。
其次,除非您可以使用相同的触发器类型技巧来保证数据不会失步,否则不要跨表(例如当前架构)复制数据。当您向客户发送最终余额与起始余额加购买不匹配的发票时,您的客户会怎么做?这不会让你的公司看起来很专业: - )
第三(这与会计相关),您通常不需要担心动态计算余额时的交易数量。这是因为会计系统通常在年底具有翻转功能,这会重置期初余额。
因此,您通常不会一次处理超过一年的数据,除非您是美国政府或微软,否则不会那么费力。
答案 1 :(得分:3)
id可能更快,但datetime更安全;如果性能问题添加索引,请使用后者。
答案 2 :(得分:2)
就我个人而言,我从不相信这种自动增量。我按日期排序。
我很确定ID保证是唯一的,但不一定是连续的和增加的。