我环顾四周,无法找到答案。
我想知道在MY SQL Workbench中是否有一种方法可以为每个查询添加默认的ORDER BY
?
我期待ORDER BY id DESC
例如,当我'右键单击'在我的表架构上说“选择行”#39;生成的查询是:
SELECT * FROM payments
我希望它是:
SELECT * FROM payments ORDER BY id DESC
答案 0 :(得分:3)
在MY SQL Workbench中有哪种方法可以为每个查询添加默认的ORDER BY?
没有
在没有足以确定顺序的ORDER BY
子句的情况下,SQL查询的结果集以正式不可预测的顺序显示其行。许多人因此而被绊倒:他们认为因为结果集昨天以某个顺序出现,所以今天它将以相同的顺序出现。直到它没有。如果程序在ORDER BY子句中未指定时依赖于排序,请参阅Murphy's Law.
同样适用于软件版本。人们有时会错误地认为它是新版RDMS服务器(如MySQL)的缺陷,因为它的结果与前一版本的顺序不同。它不是。
这可以帮助提高性能。订购可以是操作的时间和空间。当查询规划器知道它不必在结果集中对行进行排序时,它只能以它找到的顺序呈现它们。
答案 1 :(得分:2)
这不是您正在寻找的答案,但我会为那些好奇的人添加它。在未来,我将研究如何使其成为自己的插件。也许
在本练习中,让我们修改Workbench" Select All Statement"行为。您会看到"选择所有声明"右键单击表格时,在上下文菜单中选择"复制到剪贴板"或者"发送给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中的大多数内容都是插件)。随意更改"选择所有声明" to"选择所有声明并按ID排序"或其他任何东西。或者,添加新条目和新函数,例如select_all_and_order_statement。快乐的黑客! :)
答案 2 :(得分:2)
上面的解决方案是好的,但它不会更改菜单中的第一个默认"Select Rows"
,您需要单击"Send To SQL Editor"
-> "Select All Statements"
。
我想创建这样的插件,但是关于WB创建插件的教程并不多,尤其是如何在上下文菜单中插入新行或如何重新声明select_all_statements()
函数。
这是我的技巧,默认情况下它在第一列进行排序(通常在大多数情况下此列为主键)
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]) ))