Условно игнорировать строки загрузки данных 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,...]