13.2.9.1 SELECT ... INTO 语句

选择...进入形式SELECT使查询结果可以存储在变量中或写入文件:

  • SELECT ... INTO var_list选择列值并将其存储到变量中。

  • SELECT ... INTO OUTFILE将选定的行写入文件。可以指定列和行终止符以产生特定的输出格式。

  • SELECT ... INTO DUMPFILE将单行写入文件而没有任何格式。

给定的SELECT语句最多可以包含一个INTO子句,尽管如SELECT语法说明所示(请参见第 13.2.9 节“ SELECT 语句”),INTO可以出现在不同的位置:

  • FROM之前。例:
SELECT * INTO @myvar FROM t1;
  • 在尾随锁定子句之前。例:
SELECT * FROM t1 INTO @myvar FOR UPDATE;

INTO子句不应在嵌套的SELECT中使用,因为此类SELECT必须将其结果返回到外部上下文。在UNION语句中使用INTO也有一些限制;参见第 13.2.9.3 节“ UNION 子句”

对于INTO var_list变体:

    • var_list *列出一个或多个变量的列 table,每个变量可以是用户定义的变量,存储过程或函数参数或存储程序局部变量。 (在准备好的SELECT ... INTO var_list语句中,仅允许用户定义变量;请参见第 13.6.4.2 节“局部变量的范围和解决方案”。)
  • 所选值将分配给变量。变量数必须与列数匹配。查询应返回一行。如果查询不返回任何行,则会出现错误代码 1329 的警告(No data),并且变量值保持不变。如果查询返回多行,则会出现错误 1172(Result consisted of more than one row)。如果该语句可能检索多行,则可以使用LIMIT 1将结果集限制为单行。

SELECT id, data INTO @x, @y FROM test.t1 LIMIT 1;

用户变量名称不区分大小写。参见第 9.4 节“用户定义的变量”

SELECT ... INTO OUTFILE'文件名'形式SELECT将选定的行写入文件。该文件是在服务器主机上创建的,因此您必须具有FILE特权才能使用此语法。 * file_name *不能是现有文件,这尤其可以防止修改/etc/passwd和数据库 table 之类的文件。 character_set_filesystem系统变量控制文件名的解释。

选择...进入外档语句旨在启用将 table 转储到服务器主机上的文本文件的功能。要在其他主机上创建结果文件,通常不适合使用选择...进入外档,因为除非有网络可访问远程主机上的文件位置,否则无法写入相对于服务器主机文件系统的文件路径。服务器主机文件系统上的-mapped 路径。

或者,如果将 MySQLClient 端软件安装在远程主机上,则可以使用诸如mysql -e "SELECT ..." > file_name之类的 Client 端命令在该主机上生成文件。

选择...进入外档LOAD DATA的补码。将列值转换为CHARACTER SET子句中指定的字符集。如果不存在此类子句,则使用binary字符集转储值。实际上,没有字符集转换。如果结果集包含多个字符集中的列,则输出数据文件也将包含列,并且可能无法正确地重新加载文件。

语句的* export_options *的语法由与LOAD DATA语句一起使用的FIELDSLINES子句组成。有关FIELDSLINES子句的信息,包括它们的默认值和允许的值,请参见第 13.2.6 节“ LOAD DATA 语句”

FIELDS ESCAPED BY控制如何写特殊字符。如果FIELDS ESCAPED BY字符不为空,则在必要时使用该字符以避免歧义,因为前缀是输出中以下字符之前的前缀:

  • FIELDS ESCAPED BY个字符

  • FIELDS [OPTIONALLY] ENCLOSED BY个字符

  • FIELDS TERMINATED BYLINES TERMINATED BY值的第一个字符

  • ASCII NUL(零值字节;转义字符后实际写的是 ASCII 0,而不是零值字节)

必须转义FIELDS TERMINATED BYENCLOSED BYESCAPED BYLINES TERMINATED BY字符,以便您可以可靠地读回文件。 ASCII NUL被转义以使其更易于使用某些寻呼机查看。

生成的文件不需要符合 SQL 语法,因此不需要进行其他任何转义。

如果FIELDS ESCAPED BY字符为空,则不转义任何字符,并且将NULL输出为NULL而不是\N。指定一个空的转义字符可能不是一个好主意,特别是如果数据中的字段值包含刚给出的列 table 中的任何字符时,尤其如此。

这是一个以许多程序使用的逗号分隔值(CSV)格式生成文件的示例:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM test_table;

如果您使用INTO DUMPFILE而不是INTO OUTFILE,则 MySQL 仅将一行写入文件,没有任何列或行终止,也没有执行任何转义处理。这对于选择BLOB值并将其存储在文件中很有用。

Note

INTO OUTFILEINTO DUMPFILE创建的任何文件都可由服务器主机上的所有用户写入。原因是 MySQL 服务器无法创建一个文件,该文件由运行该帐户的用户以外的任何人拥有。 (由于这个和其他原因,切勿root的身份运行mysqld。)因此,该文件必须是可全局写入的,以便您可以操纵其内容。

如果secure_file_priv系统变量设置为非空目录名称,则要写入的文件必须位于该目录中。

在作为事件计划程序执行的事件的一部分出现的选择...进入语句的上下文中,诊断消息(不仅错误,而且警告)被写入错误日志,并在 Windows 上写入应用程序事件日志。有关更多信息,请参见第 23.4.5 节“事件调度程序状态”