mysql - 在mysql中加载数据并避免重复记录

标签 mysql perl date

我在我的 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 个问题:

  1. 当我运行 perl 文件时,出现以下错误。这是否意味着我必须在数据库中的表中添加一个字段“var”?

    Global symbol "@var" requires explicit package name at process.pl line 37. Execution of process.pl aborted due to compilation errors.

  2. 如果出于任何原因我必须从 .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/

相关文章:

c# - 测试时尝试将 C# 代码与底层数据库隔离可以得到什么好处?

php - 市场的 mysql 架构帮助

php - 从 ROW 获取 ID 并包含在可链接结果中 - PHP MYSQL

php - 从 2 个连接中检索数据并使用 Symfony 2 检索每一行的级别?

perl - 这个 if 语句有什么问题?

regex - 这个 perl 脚本的正确用法是什么?

perl:导出器不适用于 `use` 语句中的路径元素

date - 如何从 Firebird SQL 中的日期获取季度

Java 在 HH :MM:SS 中减去 2 持续时间

javascript - 从不带时区的字符串构造 JavaScript 日期(适用于 JqueryUI datepicker)