我在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');
我有两个问题:
当我运行perl文件时,出现以下错误。这是否意味着我必须在DB中的表中添加一个字段'var'?
全局符号“@var”需要在process.pl第37行显式包名。 由于编译错误,process.pl的执行中止。
如果由于任何原因我必须从.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的方法,test:
trade_dt date NOT NULL
答案 0 :(得分:1)
第一个问题中的错误消息意味着Perl将此字符串中的@var
解释为全局Perl数组名@var
,而不是SQL变量。这也意味着你已经在程序的顶部说use strict
,这很棒!
修复是转义字符串中的特殊@
字符:
(columns..., \@var, morecolumns...)
SET datecolumn = str_to_date(\@var, '%d/%m/%Y');
答案 1 :(得分:0)
对于第二个问题,将数据加载到时态表中然后使用游标,读取时间上的行并将它们插入实际表中,避免与某些逻辑代码重复(其中条件,如果存在结构控制等)
答案 2 :(得分:0)
您可以使用“REPLACE”而不是“INSERT”吗?如果没有,那么你可以在插入之前清空桌子吗?
我必须在我使用的java程序中在我的主INSERT之前清空一个表,因为我不关心旧数据......
答案 3 :(得分:0)
错误Global symbol @var..
来自perl,表示您的变量@var
未在当前范围内声明。假设它已正确使用,您可以使用my @var
声明它。如果它是一些非perl变量,则需要单引号字符串以避免变量插值。很难说你应该做什么,因为你没有显示你的代码。例如:
my $query = q#LOAD DATA INFILE 'file_name'
INTO TABLE tbl_name
FIELDS TERMINATED BY ','
(columns..., @var, morecolumns...)
SET datecolumn = str_to_date(@var, '%d/%m/%Y');#;
请注意,q()
会根据您的需要采用其他分隔符,例如#
,并会阻止字符串中的变量插值。
如果它是perl变量,您应该使用placeholders和DBI模块(或类似)来增加安全性。如果在双引号字符串中,@var
数组将被展开并填充空格(如果$"
设置为默认值),这可能不是您想要的。 E.g:
my @var = ("foo", "bar", "baz");
print "@var";
将打印foo bar baz
。