Условно игнорировать строки загрузки данных mysql

Я загружаю большой набор данных (60 гигов) в базу данных. Есть некоторые записи, которые можно пропустить, потому что они содержат пропущенные значения. Как я скажу MySQL пропускать строки, которые содержат определенные (в данном случае пропущенные) значения? Например, мой файл выглядит так

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

Третий ряд можно пропустить и не загружать. Я знаю, что могу загрузить все, а затем просто удалить его, но обработка файла объемом 60 гигабайт занимает много времени, поэтому я хочу сэкономить на вычислительной мощности.

Спасибо

2 ответа

Решение

Создайте триггер на вставке перед таблицей, который проверяет, является ли данное поле пустым

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$$

затем запустите команду загрузки данных

Если '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)' помогает нам изменить пропущенные значения '0' с помощью EXISTED KEY VALUE '1', и эти записи будут игнорироваться.

У меня возникла та же проблема, вам просто нужно добавить IGNORE в свое утверждение.

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
    [REPLACE | IGNORE]
    INTO TABLE tbl_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]
    [(col_name_or_user_var,...)]
    [SET col_name = expr,...]

см. https://mariadb.com/kb/en/library/load-data-infile/

Другие вопросы по тегам