有条件地忽略行加载数据mysql

时间:2012-02-27 05:22:41

标签: mysql sql if-statement load-data-infile

我正在将一个大型数据集(60演出)加载到数据库中。有些记录可以跳过,因为它们包含缺少的值。如何告诉MySQL跳过包含某些(在这种情况下丢失)值的行?例如,我的文件看起来像这样

Value1, Value2
1,2
3,4
,5
9,10

可以跳过第三行而不加载。我知道我可以加载所有内容然后删除它但处理60 gig文件需要很长时间,所以我想节省计算能力。

由于

3 个答案:

答案 0 :(得分:5)

如果'Value1'是唯一字段,则可以使用IGNORE选项。例如:

CREATE TABLE table1(
  Value1 INT(11) NOT NULL,
  Value2 INT(11) DEFAULT NULL,
  PRIMARY KEY (Value1)
);

LOAD DATA INFILE 'file.txt' 
  IGNORE -- forces to ingore existed records
  INTO TABLE table1
  FIELDS TERMINATED BY ','
  LINES TERMINATED BY '\r\n'
  IGNORE 1 lines
  (@var1, Value2)
  SET Value1 = IF(@var1 = 0, 1, @var1)

'IF(@ var1 = 0,1,@ var1)'帮助我们用EXISTED KEY VALUE'1'更改缺失值'0',这些记录将被忽略。

答案 1 :(得分:1)

在表上插入前创建一个触发器,检查特定字段是否为空

CREATE TRIGGER before_insert_test
BEFORE INSERT ON test FOR EACH ROW
BEGIN
    -- condition to check
    IF NEW.Value1 is null THEN
       set msg = concat('MyTriggerError: Trying to insert a null value
                  in trigger_test: ', cast(new.Value1 as char));
   signal sqlstate '45000' set message_text = msg;
    END IF;
END$$

然后运行您的加载数据命令

答案 2 :(得分:0)

我遇到了同样的问题,您只需要在语句中添加IGNORE。

LOAD DATA [LOW_PRIORITY |并发] [本地] INFILE'文件名'     [REPLACE |忽视]     进入表tbl_name     [CHARACTER SET charset_name]     [{FIELDS |列}         [由“字符串”终止”         [[可选]由“字符”括起来]         [以'char'开头”     ]     [行         [以“字符串”开头”         [由“字符串”终止”     ]     [IGNORE编号LINES]     [(col_name_or_user_var,...)]     [SET col_name = expr,...]

请参阅https://mariadb.com/kb/en/library/load-data-infile/