5

我正在使用 Go 开发一个程序,该程序大量使用 MySQL。为了便于阅读,是否可以在 INSERT 语句中的每个列名之后包含列的值?喜欢:

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

代替

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

以便更容易查看哪个值与哪个列相关联,考虑到 SQL 字符串通常会变得相当长

4

3 回答 3

3

不,您不能使用您建议的语法(尽管它会很好)。

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

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

更新以响应您的评论“语句包含来自字符串外部的变量”:如果您对 SQL 语句进行参数化,那么将列名与变量匹配很容易检查参数是否为其各自的列命名:@ColumnName.

这实际上是我在 TSQL 脚本中的操作方式:

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

(将逗号放在行首也很常见)

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

于 2013-09-22T02:20:39.517 回答
3

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

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

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

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

于 2018-03-23T10:53:25.887 回答
-1

当您使用 Golang database/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 驱动程序来解析您建议的语法并将其转换为标准 INSERT 语法,然后再将其发送到 MySQL 数据库。
  • 或编写支持您建议的语法的数据库/sql 扩展(类似于https://github.com/jmoiron/sqlx )。
于 2013-09-23T04:39:01.327 回答