условно игнорировать строки загрузки данных mysql - PullRequest
3 голосов
/ 27 февраля 2012

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

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

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

Спасибо

Ответы [ 3 ]

5 голосов
/ 27 февраля 2012

Если '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', и эти записи будут игнорироваться.

1 голос
/ 27 февраля 2012

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

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

, затем выполните команду Загрузить данные

0 голосов
/ 09 июля 2019

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

ЗАГРУЗИТЬ ДАННЫЕ [LOW_PRIORITY |CONCURRENT] [LOCAL] INFILE 'имя_файла' [REPLACE |IGNORE] INTO TABLE tbl_name [CHARACTER SET charset_name] [{FIELDS |Колонны(col_name_or_user_var, ...)] [SET col_name = expr, ...]

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

...