LOAD DATA语句
LOAD DATA [LOW_PRIORITY |CONCURRENT ] [LOCAL ]INFILE 'file_name' [REPLACE |IGNORE ]INTO TABLE tbl_name [PARTITION (partition_name [, partition_name] ...)] [CHARACTER SET charset_name] [{FIELDS |COLUMNS } [TERMINATED BY 'string'] [[OPTIONALLY ]ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ] [IGNORE number {LINES |ROWS }] [(col_name_or_user_var [, col_name_or_user_var] ...)] [SET col_name={expr |DEFAULT }, [, col_name={expr |DEFAULT }] ...]
该LOAD DATA
语句以很高的速度将行从文本文件读入表中。LOAD DATA
是的补充SELECT ... INTO OUTFILE
。(请参见“ SELECT ... INTO语句”。)要将数据从表写入文件,请使用SELECT ... INTO OUTFILE
。要将文件读回到表中,请使用LOAD DATA
。两个语句的FIELDS
and LINES
子句的语法相同。
您也可以使用mysqlimport实用程序来加载数据文件。请参见“mysqlimport-一个数据导入程序”。mysqlimport通过向LOAD DATA
服务器发送一条语句来进行操作。
有关INSERT
vs LOAD DATA
和加速效率的更多信息LOAD DATA
,请参见“优化SQL语句”。
- 分区表支持
- 输入文件名,位置和内容解释
- 复制注意事项
- 并发注意事项
- 重复键处理
- 索引处理
- 场线处理
- 列清单规格
- 输入预处理
- 报表结果信息
- 杂项
分区表支持
LOAD DATA
支持使用PARTITION
带有一个或多个以逗号分隔的分区,子分区或两者的名称列表的选项进行显式分区选择。使用此选项时,如果无法将文件中的任何行插入列表中命名的任何分区或子分区中,则该语句将失败,并显示错误“找到与给定分区集不匹配的行”。有关更多信息和示例,请参见“分区选择”。
输入文件名,位置和内容解释
文件名必须以文字字符串形式给出。在Windows上,在路径名中将反斜杠指定为正斜杠或加倍的反斜杠。该character_set_filesystem
系统变量控制的文件名字符集的解释。
服务器使用character_set_database
系统变量指示的字符集来解释文件中的信息。SET NAMES
和的设置character_set_client
不影响输入的解释。如果输入文件的内容使用的字符集与默认字符集不同,通常最好使用CHARACTER SET
子句指定文件的字符集。字符集binary
指定“不进行转换。”
LOAD DATA
将文件中的所有字段解释为具有相同的字符集,而不管字段值加载到的列的数据类型如何。为了正确解释文件内容,必须确保使用正确的字符集编写文件。例如,如果您使用mysqldump -T或通过SELECT ... INTO OUTFILE
在mysql中发布一条语句来编写数据文件,请确保使用一个--default-character-set
选项,以便在使用加载文件时将输出写入要使用的字符集中LOAD DATA
。
注意这是不可能的加载使用数据文件
ucs2
,utf16
,utf16le
,或者utf32
字符集。
该LOCAL
修改会影响预期的文件和错误处理的位置,如下文所述。LOCAL
仅当您的服务器和客户端都已配置为允许它时,它才有效。例如,如果mysqld是在local_infile
禁用系统变量的情况下启动的,LOCAL
则无法使用。请参见“ LOAD DATA LOCAL的安全注意事项”。
该LOCAL
修改会影响该文件预计将发现:
如果
LOCAL
指定,则该文件将由客户端主机上的客户端程序读取并发送到服务器。可以将文件指定为完整路径名以指定其确切位置。如果给出为相对路径名,则相对于启动客户端程序的目录解释该名称。LOCAL
与配合使用时LOAD DATA
,将在MySQL服务器存储临时文件的目录中创建文件的副本。请参见第B.4.3.5节“ MySQL在哪里存储临时文件”。该目录中副本的足够空间不足会导致LOAD DATA LOCAL
语句失败。如果
LOCAL
未指定,则该文件必须位于服务器主机上,并且可以由服务器直接读取。服务器使用以下规则来定位文件:- 如果文件名是绝对路径名,则服务器将使用给定的名称。
- 如果文件名是具有一个或多个前导组件的相对路径名,则服务器将搜索相对于服务器数据目录的文件。
- 如果给出的文件名中没有前导组件,则服务器将在默认数据库的数据库目录中查找该文件。
在非LOCAL
情况下,这些规则意味着./myfile.txt
从服务器的数据目录myfile.txt
中读取名称为as的文件,而从默认数据库的数据库目录中读取名为as的文件。例如,如果db1
是默认数据库,则以下LOAD DATA
语句data.txt
从数据库目录中读取的文件db1
,即使该语句将文件显式加载到db2
数据库的表中也是如此:
LOAD DATA INFILE 'data.txt'INTO TABLE db2.my_table;
注意服务器还使用非
LOCAL
规则来定位.sdi
该IMPORT TABLE
语句的文件。
非LOCAL
加载操作读取服务器上的文本文件。出于安全原因,此类操作需要您具有FILE
特权。请参见“ MySQL提供的特权”。同样,非LOCAL
加载操作也受secure_file_priv
系统变量设置的影响。如果变量值为非空目录名,则要加载的文件必须位于该目录中。如果变量值为空(不安全),则服务器仅需要读取文件。
使用LOCAL
该文件比让服务器直接访问文件要慢一些,因为文件内容必须由客户端通过连接发送到服务器。另一方面,您不需要FILE
特权来加载本地文件。
LOCAL
也影响错误处理:
- 使用
LOAD DATA
,数据解释和重复键错误终止操作。 - 使用
LOAD DATA LOCAL
,数据解释和重复键错误将成为警告,并且操作将继续,因为服务器无法在操作过程中停止文件的传输。对于重复键错误,这与IGNORE
指定的相同。IGNORE
在本节后面将进一步解释。
复制注意事项
LOAD DATA
对于基于语句的复制被认为是不安全的。如果您确实使用了LOAD DATA
when binlog_format=STATEMENT
设置,则会在应用更改的复制从属服务器上创建一个包含数据的临时文件。如果服务器上的二进制日志加密处于活动状态,请注意该临时文件未加密。当需要加密时,请确保改用基于行或混合的二进制日志记录格式,这些格式不会创建临时文件。有关LOAD DATA
复制之间的交互的更多信息,
并发注意事项
如果使用LOW_PRIORITY
修饰符,则该LOAD DATA
语句的执行将延迟,直到没有其他客户端从表中读取为止。这会影响只使用表级锁只存储引擎(例如MyISAM
,MEMORY
和MERGE
)。
如果CONCURRENT
用MyISAM
满足并发插入条件的表指定修饰符(即中间不包含空闲块),则其他线程可以在LOAD DATA
执行时从表中检索数据。LOAD DATA
即使没有其他线程同时使用该表,此修饰符也会影响位的性能。
重复键处理
在REPLACE
与IGNORE
修饰符控制处理是唯一键值重复现有行输入行:
- 如果指定
REPLACE
,则输入行将替换现有行。换句话说,主键或唯一索引的值与现有行的值相同的行。请参见“ REPLACE语句”。 - 如果指定
IGNORE
,则在唯一键值上复制现有行的行将被丢弃。有关更多信息,请参见 IGNORE关键字和严格SQL模式的比较。 - 如果您未指定任何修饰符,则行为取决于是否
LOCAL
指定了修饰符。如果不使用LOCAL
,则在找到重复的键值时会发生错误,而文本文件的其余部分将被忽略。使用LOCAL
,默认行为与IGNORE
指定的行为相同。这是因为服务器无法在操作过程中停止文件的传输。
索引处理
要在装入操作期间忽略外键约束,请在执行SET foreign_key_checks = 0
之前执行一条语句LOAD DATA
。
如果您LOAD DATA
在空MyISAM
表上使用,则所有非唯一索引都是在单独的批次中创建的(与一样REPAIR TABLE
)。通常,LOAD DATA
当您有很多索引时,这样做会更快。在某些极端情况下,可以通过以下方法更快地创建索引:ALTER TABLE ... DISABLE KEYS
在将文件加载到表中之前将其关闭,并在加载文件ALTER TABLE ... ENABLE KEYS
后重新创建索引。请参见“优化SQL语句”。
场线处理
对于LOAD DATA
和SELECT ... INTO OUTFILE
语句,FIELDS
和LINES
子句的语法相同。这两个子句都是可选的,但如果同时指定了两个子句,则FIELDS
必须在LINES
它们之前。
如果指定一个FIELDS
子句,则每个子句(TERMINATED BY
,[OPTIONALLY] ENCLOSED BY
和ESCAPED BY
)也是可选的,但必须指定至少一个子句。这些子句的参数只能包含ASCII字符。
如果指定no FIELDS
或LINES
子句,则默认值与编写此代码的默认值相同:
FIELDS TERMINATED BY '\t'ENCLOSED BY ''ESCAPED BY '\\'LINES TERMINATED BY '\n'STARTING BY ''
反斜杠是SQL语句中字符串中的MySQL转义字符。因此,要指定文字反斜杠,必须将两个反斜杠指定为将值解释为单个反斜杠。转义序列'\t'
和分别'\n'
指定制表符和换行符。
换句话说,默认值导致LOAD DATA
在读取输入时的行为如下:
- 在换行符处查找行边界。
- 不要跳过任何行前缀。
- 在选项卡上将行分成字段。
- 不要期望将字段括在任何引号中。
- 将转义字符后的字符解释
\
为转义序列。例如,\t
,\n
,和\\
,则意味着制表符,换行符和反斜杠,分别。有关FIELDS ESCAPED BY
转义序列的完整列表,请参见后面的讨论。
相反,SELECT ... INTO OUTFILE
在写入输出时,默认值将导致以下行为:
- 在字段之间编写标签。
- 请勿将字段括在任何引号中。
- 使用
\
逃脱制表符,换行符或实例\
字段值内发生的。 - 在行尾写换行符。
注意对于Windows系统上生成的文本文件,可能需要正确读取文件,
LINES TERMINATED BY '\r\n'
因为Windows程序通常使用两个字符作为行终止符。某些程序(例如WordPad)\r
在写入文件时可能会用作行终止符。要读取此类文件,请使用LINES TERMINATED BY '\r'
。
如果所有输入行都有您要忽略的公共前缀,则可以使用跳过前缀及其前面的所有内容。如果一行不包含前缀,则会跳过整行。假设您发出以下语句:LINES STARTING BY 'prefix_string'
LOAD DATA INFILE '/tmp/test.txt'INTO TABLE testFIELDS TERMINATED BY ','LINES STARTING BY 'xxx';
如果数据文件如下所示:
xxx"abc",1 something xxx"def",2 "ghi",3
结果行将为("abc",1)
和("def",2)
。文件中的第三行不包含前缀,因此被跳过。
该选项可用于忽略文件开头的行。例如,您可以用来跳过包含列名称的初始标题行:IGNORE number LINES
IGNORE 1 LINES
LOAD DATA INFILE '/tmp/test.txt'INTO TABLE testIGNORE 1LINES ;
当您SELECT ... INTO OUTFILE
与之配合使用时LOAD DATA
,将数据从数据库写入文件,然后在以后将文件读回数据库时,这两个语句的字段和行处理选项必须匹配。否则,LOAD DATA
将无法正确解释文件的内容。假设您SELECT ... INTO OUTFILE
用来编写一个文件,其字段由逗号分隔:
SELECT *INTO OUTFILE 'data.txt'FIELDS TERMINATED BY ','FROM table2;
要读取以逗号分隔的文件,正确的语句应为:
LOAD DATA INFILE 'data.txt'INTO TABLE table2FIELDS TERMINATED BY ',';
相反,如果您尝试使用如下所示的语句读取文件,则该文件将不起作用,因为它指示LOAD DATA
在字段之间寻找制表符:
LOAD DATA INFILE 'data.txt'INTO TABLE table2FIELDS TERMINATED BY '\t';
可能的结果是,每条输入线将被解释为单个字段。
LOAD DATA
可用于读取从外部来源获得的文件。例如,许多程序可以用逗号分隔值(CSV)格式导出数据,从而使行具有以逗号分隔并用双引号引起来的字段,并以列名作为初始行。如果此类文件中的行以回车/换行符对终止,则此处显示的语句说明了用于加载文件的字段和行处理选项:
LOAD DATA INFILE 'data.txt'INTO TABLE tbl_nameFIELDS TERMINATED BY ','ENCLOSED BY '"'LINES TERMINATED BY '\r\n'IGNORE 1LINES ;
如果输入值不一定用引号引起来,请OPTIONALLY
在ENCLOSED BY
选项前使用。
任何字段或行处理选项都可以指定一个空字符串(''
)。如果不为空,则FIELDS[OPTIONALLY] ENCLOSED BY
和FIELDS ESCAPED BY
值必须为单个字符。的FIELDS TERMINATED BY
,LINES STARTING BY
和LINES TERMINATED BY
值可超过一个字符。例如,要编写以回车/换行对结尾的行,或读取包含此类的文件,请指定一个LINES TERMINATED BY '\r\n'
子句。
要读取包含由组成的行分隔的笑话的文件%%
,可以执行此操作
CREATE TABLE jokes (a INT NOT NULLAUTO_INCREMENT PRIMARY KEY , joke TEXT NOT NULL);LOAD DATA INFILE '/tmp/jokes.txt'INTO TABLE jokesFIELDS TERMINATED BY ''LINES TERMINATED BY '\n%%\n' (joke);
FIELDS[OPTIONALLY] ENCLOSED BY
控制字段的引用。对于输出(SELECT ... INTO OUTFILE
),如果省略单词OPTIONALLY
,则所有字段都用ENCLOSED BY
字符括起来。这样的输出示例(使用逗号作为字段定界符)如下所示:
"1","a string","100.20" "2","a string containing a , comma","102.20" "3","a string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20"
如果指定OPTIONALLY
的ENCLOSED BY
字符从具有字符串数据类型(如列只用来围值CHAR
,BINARY
,TEXT
,或ENUM
):
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20
通过ENCLOSED BY
在字段值中添加ESCAPED BY
字符前缀,可以避免出现字符。另外,如果您指定一个空ESCAPED BY
值,则可能会无意中生成不能正确读取的输出LOAD DATA
。例如,如果转义字符为空,则刚刚显示的前面的输出将显示如下。请注意,第四行的第二个字段在引号后包含一个逗号(错误地显示为终止该字段):
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20
对于输入,ENCLOSED BY
字符(如果存在)从字段值的末尾去除。(无论是否OPTIONALLY
指定,都是如此;OPTIONALLY
对输入解释没有影响。)出现在ENCLOSED BY
字符前面的ESCAPED BY
字符将被解释为当前字段值的一部分。
如果字段以ENCLOSED BY
字符开头,则只有在其后跟字段或行TERMINATED BY
序列时,该字符的实例才被视为终止字段值。为了避免歧义,ENCLOSED BY
可以将字段值中字符的出现次数加倍,并将其解释为字符的单个实例。例如,如果ENCLOSED BY '"'
指定了,引号的处理如下所示:
"The ""BIG"" boss" -> The "BIG" boss The "BIG" boss -> The "BIG" boss The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY
控制如何读取或写入特殊字符:
对于输入,如果
FIELDS ESCAPED BY
字符不为空,则会删除该字符的出现,并将下一个字符从字面上视为字段值的一部分。一些两个字符的序列是例外,其中第一个字符是转义字符。下表显示了这些序列(\
用于转义符)。NULL
处理规则将在本节后面介绍。字符 转义序列 \0
ASCII NUL( X'00'
)字符\b
退格字符 \n
换行符(换行符) \r
回车符 \t
制表符。 \Z
ASCII 26(Control + Z) \N
空值 有关
\
-escape语法的更多信息,请参见“字符串文字”。如果
FIELDS ESCAPED BY
字符为空,则不会发生转义序列解释。对于输出,如果
FIELDS ESCAPED BY
字符不为空,则在输出上使用以下字符作为前缀:- 该
FIELDS ESCAPED BY
字符。 - 该
FIELDS[OPTIONALLY] ENCLOSED BY
字符。 FIELDS TERMINATED BY
和LINES TERMINATED BY
值的第一个字符(如果该ENCLOSED BY
字符为空或未指定)。- ASCII
0
(在转义字符之后实际写的是ASCII0
,而不是零值字节)。
如果
FIELDS ESCAPED BY
字符为空,则不会转义任何字符并将NULL
其输出为NULL
,而不是\N
。指定一个空的转义字符可能不是一个好主意,特别是如果数据中的字段值包含刚给出的列表中的任何字符时,尤其如此。- 该
在某些情况下,字段和行处理选项会相互作用:
- 如果
LINES TERMINATED BY
为空字符串且FIELDS TERMINATED BY
非空,则行也以终止FIELDS TERMINATED BY
。 如果
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
值均为空(''
),则使用固定行(无分隔符)格式。使用固定行格式时,字段之间不使用定界符(但是您仍然可以使用行终止符)。而是使用足够宽的字段宽度来读取和写入列值,以容纳该字段中的所有值。为TINYINT
,SMALLINT
,MEDIUMINT
,INT
,和BIGINT
,场宽度是4,6,8,11,和20,分别,不管声明显示宽度是什么。LINES TERMINATED BY
仍用于分隔行。如果一行未包含所有字段,则其余各列将设置为其默认值。如果没有行终止符,则应将其设置为''
。在这种情况下,文本文件必须包含每一行的所有字段。固定行格式还会影响
NULL
值的处理,如稍后所述。注意
如果使用多字节字符集,则固定尺寸格式不起作用。
NULL
值的处理方式根据使用的FIELDS
和LINES
选项而有所不同:
- 对于默认值
FIELDS
和LINES
值,NULL
将其写\N
为输出的字段值,将字段值\N
读NULL
为输入的字段值(假设ESCAPED BY
字符为\
)。 - 如果
FIELDS ENCLOSED BY
不为空,则将包含文字单词NULL
作为其值的字段读取为NULL
值。这与字符中NULL
包含的单词不同FIELDS ENCLOSED BY
,后者被视为字符串'NULL'
。 - 如果
FIELDS ESCAPED BY
为空,NULL
则写为单词NULL
。 - 具有固定行格式(当
FIELDS TERMINATED BY
和FIELDS ENCLOSED BY
均为空时使用),NULL
被写为空字符串。这将导致NULL
表中的值和空字符串在写入文件时都无法区分,因为它们都是作为空字符串写入的。如果在回读文件时需要能够区分两者,则不应使用固定行格式。
尝试加载NULL
到NOT NULL
列中会导致为列的数据类型分配隐式默认值和警告,或者在严格的SQL模式下出错。“数据类型默认值”中讨论了隐式默认值。
某些情况不受以下支持LOAD DATA
:
- 固定大小的行(
FIELDS TERMINATED BY
且FIELDS ENCLOSED BY
均为空)和BLOB
或TEXT
列。 如果指定的一个分隔符与另一个分隔符相同或作为另一个分隔符,则
LOAD DATA
无法正确解释输入。例如,以下FIELDS
子句将引起问题:FIELDS TERMINATED BY '"'ENCLOSED BY '"'- 如果
FIELDS ESCAPED BY
为空,则包含出现FIELDS ENCLOSED BY
或LINES TERMINATED BY
跟随该FIELDS TERMINATED BY
值LOAD DATA
的字段值会导致过早停止读取字段或行。发生这种情况是因为LOAD DATA
无法正确确定字段或行值的结束位置。
列清单规格
下面的示例加载表的所有列persondata
:
LOAD DATA INFILE 'persondata.txt'INTO TABLE persondata;
默认情况下,如果LOAD DATA
语句末尾未提供任何列列表,则输入行应包含每个表列的字段。如果只想加载表的某些列,请指定列列表:
LOAD DATA INFILE 'persondata.txt'INTO TABLE persondata (col_name_or_user_var [, col_name_or_user_var] ...);
如果输入文件中字段的顺序与表中列的顺序不同,则还必须指定列列表。否则,MySQL无法告知如何将输入字段与表列匹配。
输入预处理
每个col_name_or_user_var
值可以是列名或用户变量。使用用户变量,该SET
子句使您可以在将结果分配给列之前对其值执行预处理转换。
SET
子句中的用户变量可以以多种方式使用。以下示例将第一个输入列直接用于的值t1.column1
,并将第二个输入列分配给用户变量,该用户变量在用于值之前要进行除法运算t1.column2
:
LOAD DATA INFILE 'file.txt'INTO TABLE t1 (column1, @var1)SET column2 = @var1/100;
该SET
子句可用于提供不是从输入文件派生的值。以下语句设置column3
为当前日期和时间:
LOAD DATA INFILE 'file.txt'INTO TABLE t1 (column1, column2)SET column3 =CURRENT_TIMESTAMP ;
您也可以通过将输入值分配给用户变量而不将变量分配给表列来丢弃它:
LOAD DATA INFILE 'file.txt'INTO TABLE t1 (column1, @dummy, column2, @dummy, column3);
列/变量列表和SET
子句的使用受到以下限制:
SET
子句中的赋值应仅在赋值运算符的左侧具有列名。- 您可以在
SET
分配的右侧使用子查询。返回要分配给列的值的子查询只能是标量子查询。此外,您不能使用子查询从正在加载的表中进行选择。 IGNORE
子句忽略的行不会为列/变量列表或SET
子句处理。- 当加载固定行格式的数据时,不能使用用户变量,因为用户变量没有显示宽度。
处理输入行时,LOAD DATA
将其分成多个字段,并根据列/变量列表和SET
子句(如果存在)使用值。然后将结果行插入到表中。如果该表有BEFORE INSERT
或AFTER INSERT
触发器,则分别在插入行之前或之后激活它们。
如果输入行的字段过多,则多余的字段将被忽略,并且警告数量会增加。
如果输入行的字段太少,则缺少输入字段的表列将设置为其默认值。“数据类型默认值”中介绍了默认值分配。
空字段值的解释与缺少字段的解释不同:
- 对于字符串类型,该列设置为空字符串。
- 对于数字类型,该列设置为
0
。 - 对于日期和时间类型,该列将设置为该类型的相应“零”值。请参见“日期和时间数据类型”。
如果您在INSERT
or UPDATE
语句中为字符串,数字或日期或时间类型显式分配一个空字符串,则这些值将与这些值相同。
如果将SQL模式设置为限制性值,则对空或不正确的字段值的处理与刚刚描述的不同。例如,如果sql_mode
设置为,则将TRADITIONAL
空值或诸如'x'
数字列之类的值转换将导致错误,而不是转换为0。(使用LOCAL
或IGNORE
,即使是限制性sql_mode
值,也会发生警告而不是错误,并且使用与非限制性SQL模式相同的最接近值行为来插入行。这是因为服务器无法在操作中间停止文件的传输。)
TIMESTAMP
仅当NULL
该列有一个值(即\N
)且该列未声明为允许NULL
值时,或者该TIMESTAMP
列的默认值为当前时间戳记且该字段被省略时,才将列设置为当前日期和时间。指定字段列表时的列表。
LOAD DATA
将所有输入视为字符串,因此您不能像使用语句那样使用数字值ENUM
或SET
列INSERT
。所有ENUM
和SET
值必须指定为字符串。
BIT
值不能使用二进制表示法直接加载(例如b'011010'
)。要解决此问题,请使用该SET
子句剥离开头b'
和结尾'
并执行从2到10的基数转换,以便MySQL将值BIT
正确加载到列中:
shell>cat /tmp/bit_test.txt b'10' b'1111111' shell>mysql test mysql>LOAD DATA INFILE '/tmp/bit_test.txt' INTO TABLE bit_test (@var1) SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-3), 2, 10) AS UNSIGNED); Query OK, 2 rows affected (0.00 sec) Records: 2 Deleted: 0 Skipped: 0 Warnings: 0 mysql>SELECT BIN(b+0) FROM bit_test; +---------- + | BIN(b +0) | +---------- + | 10 | | 1111111 | +---------- + 2 rows in set (0.00 sec)
对于BIT
采用0b
二进制表示法的值(例如0b011010
),请改用此SET
子句去除开头的内容0b
:
SET b = CAST(CONV(MID(@var1, 3, LENGTH(@var1)-2), 2, 10)AS UNSIGNED )
报表结果信息
当LOAD DATA
语句完成,它返回以下格式的信息字符串:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
在与使用INSERT
语句插入值的情况相同的情况下,会发生警告(请参见“ INSERT语句”),LOAD DATA
但当输入行中的字段太少或太多时,也会生成警告。
您可以SHOW WARNINGS
用来获取第一个max_error_count
警告的列表,作为有关出了什么问题的信息。请参见“ SHOW WARNINGS语句”。
如果使用的是C API,则可以通过调用该mysql_info()
函数来获取有关该语句的信息。参见“ mysql_info()”。
杂项
在Unix上,如果需要LOAD DATA
从管道读取,则可以使用以下技术(该示例将/
目录列表加载到table中db1.t1
):
mkfifo /mysql/data/db1/ls.dat chmod 666 /mysql/data/db1/ls.dat find / -ls > /mysql/data/db1/ls.dat & mysql -e "LOAD DATA INFILE 'ls.dat' INTO TABLE t1" db1
在这里,您必须在单独的终端上运行生成要加载的数据的命令和mysql命令,或者在后台运行数据生成过程(如前面的示例所示)。如果不这样做,则管道将阻塞,直到mysql进程读取数据为止。