在给定的表中,我有一个字段(field_order
),它将用作定义用于显示表行的自定义顺序的方式。插入新记录时
我想用该表中的行数加上一个来设置该特定字段
因此,如果表有3行,则在插入新行时,field_order
的默认值应为4。
设置该值的最佳方法是什么?
在insert语句中有一个简单的select计数?
是否有像CURRENT_TIMESTAMP
这样的常量,可以返回该值的TIMESTAMP
数据类型?
编辑:这样做的原因是能够按该特定字段对表格进行排序;并且该字段将由用户使用jQuery的sortable在客户端进行操作
最佳答案
好的,因此围绕该问题的解决方案实际上涉及一些细微差别。继续前进并决定回答,但也想解决评论尚未解决的一些细微差别/细节。
首先,我强烈建议您不要在主键上使用auto_increment,如果没有其他原因使这些自动增量id很容易被抛弃(例如,回滚的事务会干扰它们MySQL AUTO_INCREMENT does not ROLLBACK),那么我会极力建议您不要在主键上使用auto_increment。将删除,如@Sebas所述)。
其次,您必须考虑您的存储引擎。如果使用MyISAM,则可以非常快速地获取表的COUNT(*)(因为MyISAM始终知道每个表中有多少行)。如果您使用的是INNODB,则不是这种情况。根据您需要该表的用途,您也许可以摆脱MyISAM的束缚。它不是默认引擎,但是肯定有可能遇到MyISAM是更好选择的要求。
您应该问自己的第三件事是:“为什么?”为什么根本需要那种方式存储数据?这实际上给你什么?实际上,您是否需要SQL中的信息?在同一个表的同一个SQL表中?
如果“为什么”有一个合理的答案,那么我要问的最后一件事是“如何”?特别是,您将如何处理并发插入?您将如何处理删除或回滚?
考虑到您的要求,基本上有必要对表进行计数……但是即使那样,仍会涉及一些细微差别(删除,回滚和并发),还需要做出一些决定(您使用哪种存储引擎;可以避免使用MyISAM,对于计数星星来说这会更快吗?)。
但是,最重要的是,我会质疑为什么我首先需要它。也许您确实做到了……但这是一个非常奇怪的要求。
根据您的编辑:
本质上,您要的是有关表的元数据。而且,我建议将这些元数据存储在单独的表中,或完全存储在单独的服务(Elastic Search,Redis等)中。您将需要定期更新该单独的表(或键值存储)。如果在SQL中执行此操作,则可以使用触发器。或者您使用了类似Elastic Search之类的工具,则可以将数据同时插入SQL和ES中。无论哪种方式,您都需要解决一些棘手的问题(例如,最终的一致性,并发性,以及在MySQL中使用触发器时可能适得其反的所有辉煌的事情)。
如果是我,我会注意两件事。一个,甚至Google都不提供始终最新的COUNT(*)
。 “显示第1-10行,大约为XYZ。”他们这样做的部分原因是他们拥有我想像的更多数据,部分原因是要计算表的精确COUNT(*)
并使其始终保持最新状态实际上是不切实际的(并且很快变得不可行和禁止) 。
因此,要么我完全改变需求并利用我可以快速获取的统计信息(如果您使用MyISAM进行存储,请继续使用count( * )
…将会非常快),或者我会考虑维护该索引计算我的 table 上的星星,这些星星每隔几个小时,每天或每天,或沿着类似的路线通过某个过程(定时作业,触发器等)定期更新。
对这个问题的赏赐是虚假的……对于这个问题,永远不会有一个单一的,规范的答案。无论您决定如何管理,都需要权衡取舍。在一致性,延迟,可伸缩性,精确解决方案与近似解决方案方面,它们可能是一个折衷方案,但要以MyISAM换取而失去INNODB……但是会有折衷方案。最终,决定权取决于您为满足需求而愿意进行的交易。
如果是我,我可能会满足我的要求。如果这样做了,我可能最终会在Elastic Search中将其编入索引,并确保每隔几个小时左右就更新一次。那是你应该做的吗?那要看。如果不是我的count(*)
有点过时的话,那肯定不是一个“正确的答案”,而是一个(很多)答案会有用的答案。
您应该为此使用Elastic Search吗?那要看。但无论如何,您都将面临权衡取舍。这不取决于。并且您将需要决定为了获得自己想要的东西而愿意放弃的东西。如果不是很关键,请调整需求。
关于mysql - MySQL中订单字段的默认值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26466753/