使SQL INSERT语句更易于阅读

时间:2013-09-22 02:18:01

标签: sql go code-readability

我正在研究Go中的一个程序,它会大量使用MySQL。为了便于阅读,是否可以在INSERT语句中的每个列名后包含列的值?像:

INSERT INTO `table` (`column1` = 'value1', `column2` = 'value2'...);

而不是

INSERT INTO `table` (`column`, `column2`,...) VALUES('value1', 'value2'...);

这样可以更容易地看到哪个值与哪个列相关联,因为SQL字符串通常可以相当长

3 个答案:

答案 0 :(得分:3)

不,你不能使用你提出的语法(虽然它会很好)。

一种方法是排列列名和值:

INSERT INTO `table` 
(`column`, `column2`,...) 
VALUES
('value1', 'value2'...);

更新以响应您的注释“语句包含来自字符串外部的变量”:如果您参数化SQL语句,那么将列名称与变量匹配很容易检查参数是否针对各自的列命名:{{1 }}

这实际上就是我在TSQL脚本中的表现:

@ColumnName

(将逗号放在行的开头也很常见)

但说实话,一旦你得到足够的列,就很容易混淆列的位置。如果它们具有相同的类型(以及相似的值范围),您可能不会立即注意到....

答案 1 :(得分:2)

虽然这个问题有点老了,但我会把它放在这里供未来的研究人员使用。

我建议使用SET语法而不是丑陋的VALUES列表语法。

INSERT INTO table
SET
column1 = 'value1',
column2 = 'value2';

恕我直言,这是MySQL中最干净的方式。

答案 2 :(得分:-1)

使用Golang数据库/ sql包时,连接到数据库的工作由您选择的SQL驱动程序执行,例如http://github.com/ziutek/mymysqlhttps://github.com/Go-SQL-Driver/MySQL/

在Query()或Exec()等函数中使用SQL语句时,几乎所有驱动程序都会将SQL语句原样传递给数据库引擎。 MySQL实现了标准的SQL INSERT语法,并且不支持您提出的语法。因此,您不能将您的建议语法与现有的Golang MySQL驱动程序和MySQL数据库一起使用。

因此,如果您想使用语法,您的解决方案是:

  • 找到一个支持您提议的非标准语法的SQL数据库,而且没有我知道的。
  • 或编写自己的Golang MySQL驱动程序,以便在将建议的语法发送到MySQL数据库之前将其解析并转换为标准的INSERT语法。
  • 或编写支持您提议的语法的数据库/ sql扩展名(类似于https://github.com/jmoiron/sqlx)。