我在我的 perl 文件中运行以下代码:
LOAD DATA INFILE 'file_name'
INTO TABLE tbl_name
FIELDS TERMINATED BY ','
(columns..., @var, morecolumns...)
SET datecolumn = str_to_date(@var, '%d/%m/%Y');
我有 2 个问题:
当我运行 perl 文件时,出现以下错误。这是否意味着我必须在数据库中的表中添加一个字段“var”?
Global symbol "@var" requires explicit package name at process.pl line 37. Execution of process.pl aborted due to compilation errors.
如果出于任何原因我必须从 .csv 文件重新加载数据并再次运行此命令,它会将新记录添加为重复项。如何编辑上述代码以避免重复记录?
更新了 Perl 的相关代码:
my $sql = "LOAD DATA LOCAL INFILE '$fname' INTO TABLE $tname FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n' (trade_dt,t_id,....open_int);";
print $sql,"\n"; #date is going in as '0000-00-00'
$dbh->do($sql) or die $dbh->errstr;
这是 mySQL 中显示的内容
mysql> select max(trade_dt) from test;
+---------------+
| max(trade_dt) |
+---------------+
| 0000-00-00 |
+---------------+
1 row in set (0.04 sec)
我的理解是,我需要添加SET trade_dt=str_to_date()
以将日期作为yyyy-mm-dd
放入我的数据库中。在我上传到数据库的 .csv 文件中,日期的格式为 dd/mm/yyyy
另外,如果有帮助的话,这就是在 mySQL 表中声明 trade_dt 的方式,测试:
trade_dt date NOT NULL
最佳答案
第一个问题中的错误消息意味着 Perl 将此字符串中的 @var
解释为全局 Perl 数组名称 @var
,而不是 SQL 变量。这也意味着您已经在程序顶部说过use strict
,这太棒了!
修复方法是转义字符串中的特殊 @
字符:
(columns..., \@var, morecolumns...)
SET datecolumn = str_to_date(\@var, '%d/%m/%Y');
关于mysql - 在mysql中加载数据并避免重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8976175/