在给定的表中,我有一个field(field_order),用于定义显示表行的自定义顺序.插入新记录时,我想设置该特定字段,其中包含该表中的行数加1
因此,如果表有3行,则在插入新行时,默认值field_order应为4.
设定该值的最佳方法是什么?
insert语句中有一个简单的select count?
CURRENT_TIMESTAMP对于TIMESTAMP返回该值的数据类型是否有常量?
编辑:这背后的原因是能够按该特定字段对表进行排序; 并且该字段将由客户端的用户使用jQuery的可排序操作
好的,围绕这个问题的解决方案实际上涉及一些细微差别.走在前面并决定回答,但也想解决一些评论尚未解决的细微差别/细节.
首先,我非常强烈建议你不要在主键上使用auto_increment,如果没有其他原因那么这些自动增量id很容易被抛出(例如,回滚事务会干扰它们的问题)不是ROLLBACK.所以会删除,如@Sebas所提到的).
其次,您必须考虑您的存储引擎.如果您使用的是MyISAM,则可以非常快速地获取表的COUNT(*)(因为MyISAM始终知道每个表中有多少行).如果你正在使用INNODB,情况并非如此.根据您对此表的需求,您可以使用MyISAM.它不是默认引擎,但您可能会遇到MyISAM更好选择的要求.
你应该问自己的第三件事是,"为什么?" 为什么需要以这种方式存储数据?这实际上给你了什么?你实际上在SQL中需要那些信息吗?在同一个SQL表的同一个表中?
如果"为什么"有一个合理使用它的答案,那么我要问的最后一件事是"怎么样?" 特别是,您将如何处理并发插入?你打算怎么处理删除或回滚?
鉴于您的要求,基本上需要做表的计数星......但即便如此,还是有一些细微差别(删除,回滚,并发)以及一些决定(你使用哪个存储引擎;你能不能使用MyISAM,这对于数星来说会更快?).
但最重要的是,我会问我为什么首先需要这个.也许你真的这么做......但这是一个非常奇怪的要求.
在您的编辑中:
编辑:这背后的原因是能够按该特定字段对表进行排序; 并且该字段将由客户端的用户使用jQuery的可排序操作
基本上你要求的是关于你的表的元数据.我建议将这些元数据存储在单独的表中,或者单独存储在一个单独的服务中(Elastic Search,Redis等).您需要定期更新该单独的表(或键值存储).如果您在SQL中执行此操作,则可以使用触发器.或者您使用了类似Elastic Search的东西,您可以同时将数据插入SQL和ES.无论哪种方式,您都需要应对一些棘手的问题(例如,最终的一致性,并发性,以及在MySQL中使用触发器时可能适得其反的所有光荣事物).
如果是我,我会注意到两件事.其中一个,甚至谷歌都没有提供最新的COUNT(*)."显示大约XYZ的1-10行." 他们这样做的部分原因是因为他们有更多我想象你做过的数据,部分原因是因为它实际上是不切实际的(并且很快变得不可行和禁止)来计算COUNT(*)表格的精确度并始终保持最新状态.
所以,要么我完全改变我的要求并利用我可以快速获得的统计数据(如果你使用MyISAM进行存储,请继续使用count( * )......它会非常快)或者我会考虑保持计数的索引我的表中的星星,每隔几个小时,或每天,或某些东西,通过某些过程(cron作业,触发器,等等)定期更新.
在这个问题上获得奖励......对这个问题永远不会有单一的,规范的答案.无论你如何决定管理它,都需要做出权衡.它们可能在一致性,延迟,可扩展性,精确与近似解决方案,丢失INNODB以换取MyISAM方面进行权衡......但会有权衡.最终决定归结为您愿意交易的东西以满足您的要求.
如果是我,我可能会弯曲我的要求.如果我这样做,我可能最终会在弹性搜索中对其进行索引,并确保它每隔几个小时左右更新一次.这是你应该做的吗?那要看.它肯定不是一个"正确的答案",因为如果我可以忍受count(*)一些过时的事情,那么它就是一个答案(在许多答案中).
你应该使用Elastic Search吗?那要看.但是,无论你走多远,你都会处理权衡.这不取决于.而且你需要决定你愿意放弃什么才能得到你想要的东西.如果它不重要,请弯曲要求.
| 归档时间: |
|
| 查看次数: |
1070 次 |
| 最近记录: |