MySQL Workbench:默认ORDER BY

4
我找了很久也没有找到答案。
我想知道在MySQL Workbench中是否有一种方法可以默认将ORDER BY添加到每个查询中?
我想要按照id降序排列:ORDER BY id DESC 例如,当我“右键单击”我的表模式并选择“选择行”时,生成的查询为: SELECT * FROM payments 我希望它变成: SELECT * FROM payments ORDER BY id DESC

4
没有。许多结果集不会有一个“id”列,因此添加这样的“ORDER BY”子句是没有意义的,更不用说那些实际上需要其他排序方式的查询了。 - eggyal
3个回答

5
在MySQL Workbench中,是否有一种方法可以将默认的ORDER BY添加到每个查询中?
没有。
此外,在缺乏足以确定顺序的ORDER BY子句的情况下,SQL查询的结果集以正式不可预测的顺序呈现其行。很多人会被这个问题绊倒:他们认为因为昨天的结果集以某种顺序出现,今天它也会以相同的顺序出现。直到不再这样为止。如果程序依赖于未在ORDER BY子句中指定排序时的顺序,那么请参见墨菲定律
对于软件版本也是如此。有时候人们错误地认为像MySQL这样的RDMS服务器的新版本在呈现与前一个版本不同的结果顺序时存在缺陷。但实际上并不是如此。
这可以提高性能。排序可能是一项耗时和占用空间的操作。当查询计划器知道它不必对结果集中的行进行排序时,它可以只按照它发现它们的任何顺序呈现它们。

谢谢。我已经将这个标记为正确答案。你是正确的。我确实明白排序是低效的。我只是希望在Workbench的细节中有一些自定义的东西,但这解释了为什么我找不到它。再次感谢。 - Sweet Chilly Philly
我喜欢提到墨菲定律的参考。 - Gordon Linoff

3
上面的解决方案很好,但它并没有改变菜单中第一个默认的“选择行”,您需要点击“发送到SQL编辑器”->“选择所有语句”。 我想创建这样的插件,但是没有多少教程介绍如何为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编辑器”? - Sweet Chilly Philly
1
在左上角,在“模式”选项下,有一个数据库树。选择Database->Tables->任何表后,右键单击该表会显示上下文菜单:http://i65.tinypic.com/x1hzqf.jpg - Oleksiy Guzenko

3
这不是你想要的答案,但我会把它加上给那些好奇的人。将来我会研究如何将其作为自己的插件。也许。
针对这个练习,让我们修改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中的大多数内容都是插件)。随意将“选择所有语句”更改为“选择所有语句并按id排序”或其他任何内容。或者,添加新条目和新功能,例如select_all_and_order_statement。愉快的编程!:)


这样的 hack,我希望能够得到改进和实现!我会很喜欢 :) 插件的想法听起来非常不错。 - Sweet Chilly Philly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接