mysql - mysql中订单字段的默认值

标签 mysql

在给定的表中,我有一个字段( field_order ),它将作为定义显示表行的自定义顺序的方式。插入新记录时
我想用该表中的行数加一来设置该特定字段

所以如果表有3行,在插入新行时,默认值为field_order应该是4。

设置该值的最佳方法是什么?

插入语句中的简单选择计数?

是否有类似 CURRENT_TIMESTAMP 的常量为 TIMESTAMP返回该值的数据类型?

编辑 :这背后的原因是能够按特定字段对表格进行排序;并且该字段将由客户端的用户使用 jQuery 的 sortable 进行操作

最佳答案

好的,所以围绕这个问题的解决方案实际上涉及一些细微差别。继续并决定回答,但也想解决评论尚未解决的一些细微差别/细节。

首先,我强烈建议您不要在主键上使用 auto_increment,如果没有其他原因,这些自动增量 ID 很容易被丢弃(例如,回滚事务会干扰它们 MySQL AUTO_INCREMENT does not ROLLBACK . 所以会删除,正如@Sebas 提到的那样)。

其次,您必须考虑您的存储引擎。如果您使用的是 MyISAM,您可以非常快速地获得表的 COUNT(*)(因为 MyISAM 总是知道每个表中有多少行)。如果您使用的是 INNODB,则情况并非如此。根据您需要此表的用途,您可以使用 MyISAM。它不是默认引擎,但您肯定可能会遇到 MyISAM 是更好选择的需求。

你应该问自己的第三件事是,“为什么?”为什么您需要以这种方式存储数据?这实际上给了你什么?您实际上需要 SQL 中的这些信息吗?同一个SQL表的同一个表?

如果“为什么”有一个证明其使用合理的答案,那么我最后要问的是“如何?”特别是,您将如何处理并发插入?您将如何处理删除或回滚?

考虑到您的要求,对表进行计数星标基本上是必要的……但即便如此,仍然涉及一些细微差别(删除、回滚、并发)以及一些需要做出的决定(您使用哪个存储引擎;你能逃脱使用 MyISAM 吗,它会更快地计算星星?)。

不过,最重要的是,我首先会问为什么我需要这个。也许你真的这样做了……但这是一个非常奇怪的要求。

根据您的编辑:

EDIT: The reason behind this is is to be able to sort the table by that particular field; and that field would be manipulated by a user in client side using jQuery's sortable



基本上你要的是关于你的表的元数据。我建议将这些元数据存储在单独的表中,或者完全存储在单独的服务中( Elasticsearch 、Redis 等)。您需要定期更新该单独的表(或键值存储)。如果您在 SQL 中执行此操作,则可以使用触发器。或者你使用了 Elastic Search 之类的东西,你可以同时将数据插入 SQL 和 ES。无论哪种方式,您都需要处理一些棘手的问题(例如,最终的一致性、并发性,以及在 MySQL 中使用触发器时可能适得其反的所有美好事物)。

如果是我,我会注意到两件事。一,即使是 Google 也没有提供始终保持最新状态的 COUNT(*) . “显示大约 XYZ 中的第 1-10 行。”他们这样做的部分原因是他们拥有比我想象的更多的数据,部分原因是计算一个精确的 COUNT(*) 实际上是不切实际的(并且很快变得不可行且令人望而却步)。并始终保持最新状态。

因此,要么我完全改变我的要求并利用我可以快速获得的统计数据(如果您使用 MyISAM 进行存储,请继续使用 count( * ) ......它会非常快)或者我会考虑维护一个索引我的表中的计数星每隔几个小时或每天或沿着这些路线通过某个进程(cron 作业、触发器等)定期更新。

在这个问题上的赏金......这个问题永远不会有一个单一的、规范的答案。无论您决定如何管理它,都需要进行权衡。它们可能在一致性、延迟、可扩展性、精确与近似解决方案、失去 INNODB 以换取 MyISAM 方面进行权衡……但会有权衡。最终决定归结为您愿意交易什么来满足您的要求。

如果是我,我可能会改变我的要求。如果我这样做了,我可能最终会在 Elastic Search 中对其进行索引,并确保它每隔几个小时左右就会更新一次。这是你应该做的吗?那要看。这当然不是一个“正确答案”,因为如果我能忍受我的 count(*) 的话,它是一个(在众多答案中)会起作用的答案。有点过时了。

您应该为此使用 Elasticsearch 吗?那要看。但是,无论您采用哪种方式,您都将进行权衡。那不依赖。你需要决定你愿意放弃什么才能得到你想要的。如果它不是关键,请灵活调整要求。

关于mysql - mysql中订单字段的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26466753/

相关文章:

mysql - 我如何在 mysql 中合并多个连接(给出示例查询)

MySQL 按层次排序

php - mysql 获取对象上的 mysql 行数

php - 从另一个 php 文件中检索变量

mysql - 这个MySQL命令有什么问题?

php - WordPress 按标签和类别过滤产品

php - 我的 PDO 声明不起作用

MySQL 守护进程拒绝以 "Can' 启动服务器 : Bind on TCP/IP port: Address already in use"(it's not).

c# - NHibernate 不保存对象,也没有显示错误

mysql - asp.net 网页 mysql 连接