【问题标题】:MY SQL Workbench: Default ORDER BY我的 SQL 工作台:默认 ORDER BY
【发布时间】:2016-08-30 23:31:39
【问题描述】:

我环顾四周,找不到答案。

我想知道在 MY SQL Workbench 中是否有一种方法可以为每个查询添加默认的 ORDER BY

我正在寻找ORDER BY id DESC

例如,当我在我的表架构上“右键单击”并说“选择行”时,结果查询是:

SELECT * FROM payments

我希望它是:

SELECT * FROM payments ORDER BY id DESC

【问题讨论】:

  • 不,没有。许多结果集没有 id 列,通过该列附加这样的 ORDER BY 子句是有意义的——更不用说那些实际上需要其他排序的查询了。
  • 在我的问题中,我已经解释了我如何需要它。当我右键单击我的表架构并单击“选择行”时。我想知道是否有办法编辑该功能。我不是在谈论我编写的自定义查询,我可以在其中对自己的顺序进行排序,但是谢谢,尽管我确实看到了你在说什么,而且听起来我没有办法做到这一点。

标签: mysql sql sorting sql-order-by mysql-workbench


【解决方案1】:

在 MY SQL Workbench 中有没有一种方法可以为每个查询添加默认的 ORDER BY?

没有。

此外,如果没有足以确定顺序的ORDER BY 子句,SQL 查询的结果集以形式上不可预测的顺序显示它们的行。很多人被这个绊倒了:他们假设因为一个结果集昨天以某种顺序出现,所以今天它会以同样的顺序出现。它会,直到它不会。如果程序在 ORDER BY 子句中未指定时依赖于排序,那么请参阅Murphy's Law.

软件版本同上。当新版本的 RDMS 服务器(如 MySQL)以与先前版本不同的顺序显示结果时,人们有时会错误地认为这是一个缺陷。不是。

这有助于提高性能。排序可能是一项操作的时间和空间占用。当查询规划器知道它不需要对结果集中的行进行排序时,它可以按照它找到的任何顺序来呈现它们。

【讨论】:

  • 谢谢。我已将此标记为正确答案。你是对的。我确实理解订购效率低下。我只是希望在 Workbench 的基本内容中可以进行某种自定义,但这解释了为什么我找不到它。再次感谢
  • 我喜欢墨菲定律。
【解决方案2】:

这不是您要寻找的答案,但我会为那些好奇的人添加它。将来我会研究如何制作它自己的插件。也许吧。

对于这个练习,让我们修改 Workbench 的“全选语句”行为。右键单击表并选择“复制到剪贴板”或“发送到 SQL 编辑器”后,您会在上下文菜单中看到“选择所有语句”。

在我的系统 (OS X) 上,这是在这里定义的:

/Applications/MySQLWorkbench.app/Contents/Resources/plugins/sqlide_schematree_ext.py

具体来说,这段代码:

(_("Select All Statement"), 'select_all_statement', ['db.Table', 'db.View'], len(selection) > 0, False),
(_("Select All Statement"), 'select_all_statement', ['columns'], len(selection) == 1 and selection[0].type == 'columns', False),

引用此代码:

def select_all_statement(self):
# assumes only table nodes (or the Columns node of a table)
parts = []
for obj in self.selection:
    if obj.type == 'columns':
        obj = obj.owner
    parts.append("SELECT %s\nFROM %s.%s;\n" % (",\n    ".join("%s.%s" % (esc_ident(obj.name), esc_ident(c[0])) for c in self.get_table_columns(obj.schemaName, obj.name)), esc_ident(obj.schemaName), esc_ident(obj.name)))
self.send("\n".join(parts))

好吧,我还不确定如何让它变得智能(例如,找出 PK,或在上下文菜单中提供列建议),但现在让我们添加愚蠢的代码(即 ORDER BY id)。您可以将 parts.append 行修改为:

    parts.append("SELECT %s\nORDER BY id\nFROM %s.%s;\n" % (",\n    ".join("%s.%s" % (esc_ident(obj.name), esc_ident(c[0])) for c in self.get_table_columns(obj.schemaName, obj.name)), esc_ident(obj.schemaName), esc_ident(obj.name)))

就像我说的,它不是智能的。希望有一天我(或某人)将其更新为更智能。也就是说,重新启动 Workbench 将使上​​述更改显示在 Workbench 中,因为 Workbench 会在启动时重新编译插件(并且 Workbench 中的大多数内容都是插件)。随意将“Select All Statement”更改为“Select All Statement and Order by id”或其他任何内容。或者,添加新条目和新函数,例如 select_all_and_order_statement。快乐黑客! :)

【讨论】:

  • 这样的 hack,我希望这样的东西被改进,并实施!我会喜欢的 :) 插件 Idea 听起来真的很棒
【解决方案3】:

上面的解决方案很好,但是它并没有改变菜单中第一个默认的"Select Rows",你需要点击"Send To SQL Editor"->"Select All Statements"。 我想创建这样的插件,但是没有很多关于 WB 插件创建的教程,尤其是如何在上下文菜单中插入新行或如何重新声明 select_all_statements() 函数。

这是我的 hack,默认情况下按第一列排序(通常在大多数情况下,此列是主键)

parts.append("SELECT %s\nFROM %s.%s ORDER BY %s DESC;\n " % (",\n    ".join("%s.%s" % (esc_ident(obj.name), esc_ident(c[0])) for c in self.get_table_columns(obj.schemaName, obj.name)), esc_ident(obj.schemaName), esc_ident(obj.name), esc_ident(self.get_table_columns(obj.schemaName, obj.name)[0][0]) ))

【讨论】:

  • 在哪里可以找到“发送到 SQL 编辑器”?
  • 在左下角的“Schema”选项下,有一个数据库树。选择 Database->Tables->any table 后。右键单击该表会显示上下文菜单:i65.tinypic.com/x1hzqf.jpg
猜你喜欢
  • 2019-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多