|
|
|
| Этой директивой пользовалась впервые, задача была сделать загрузку данных о товарах интернет-магазина из 1С. По описанию команды у меня сложилось впечатление, что заменяться будут только те поля, которые явно перечисленны в команде. Оказалось - нет. Все остальные поля сбрасываются в дефолтное значение, а это не устраивает.
Собственно, вопрос: можно ли как-то в команде LOAD DATA INFILE указать не изменять значения остальных полей, или мне придётся разбивать таблицу на 2, в одной оставляя только колонки экспортируемые из 1С, а во второй - остальные данные?
Команда сейчас выглядит так:
LOAD DATA LOW_PRIORITY LOCAL INFILE './file.csv' REPLACE INTO TABLE CATEGORY FIELDS TERMINATED BY ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (pr, id, nm) | |
|
|
|
|
|
|
|
для: Anka
(16.08.2011 в 20:18)
| | я так понимаю есть таблица в базе и данные в ней нужно обновить в соответствии с изменениями в локальной "копии" этой базы в file.csv где присутствуют не все поля которые есть в таблице?
__
с LOAD DATA я тоже не на короткой ноге, но может всетаки сваливать все в промежуточную таблицу, а оттуда старый добрый UPDATE? | |
|
|
|
|
|
|
|
для: Valick
(16.08.2011 в 21:40)
| | Да. Таблица в базе содержит больше полей, чем таблица в 1С. Надо, чтобы внеся на сайт всю инфу заказчик в дальнейшем обновлял лишь цены и переносил новое, а остальные данные не сбрасывались в дефолт.
В принципе, наверное можно и так - загружать в промежуточную таблицу, а потом через UPDATE. Но тогда несколько теряется смысл LOAD DATA INFILE. Получившийся скрипт будет работать не особо быстрее, чем если самой парсить csv-файл и заменять поля в основной таблице.
Если LOAD DATA INFILE не позволяет не затрагивать остальные поля, то разделю данные, это на приозводительности не скажется. | |
|
|
|
|
|
|
|
для: Anka
(17.08.2011 в 13:27)
| | Получившийся скрипт будет работать не особо быстрее, чем если самой парсить csv-файл и заменять поля в основной таблице
смотря какой объем файла, но не думаю что очень большой, а при таком раскладе действительно выгода невелика
а что мешает править цены сразу напрямую в админке сайта? | |
|
|
|
|
|
|
|
для: Valick
(17.08.2011 в 13:51)
| | На полторы тысячи товаров? Это уже головная боль.
После разделения таблиц возникла другая проблема. Есть 2 таблицы:
CREATE TABLE IF NOT EXISTS CATEGORY (
id int(5) unsigned NOT NULL auto_increment,
pr int(5) unsigned NOT NULL default 0, # ID родительской категории
nm tinytext NOT NULL, # название категории
PRIMARY KEY (id)
) AUTO_INCREMENT=1 COLLATE='utf8_general_ci' COMMENT='Категории товаров - данные из 1С';
CREATE TABLE IF NOT EXISTS CATEGORY_EXT (
id int(5) unsigned NOT NULL auto_increment,
ti tinytext NOT NULL,
ds tinytext NOT NULL,
kw tinytext NOT NULL,
kf tinytext NOT NULL,
text text NOT NULL,
PRIMARY KEY (id)
) AUTO_INCREMENT=1 COLLATE='utf8_general_ci' COMMENT='Категории товаров - дополнительные данные';
Мне нужно выбрать из второй таблицы строки с в которых некоторые ячейки пустые, + из 1й таблицы те id, аналогов которым нет во второй таблице, но я как-то не могу понять как сформулировать условия в запросе:
SELECT GOOD.id, nm, ti, ds, kw, kf FROM GOOD JOIN GOOD_EXT WHERE ti='' OR ds='' OR kw='' OR kf='' OR (а вот что тут - не пойму) | |
|
|
|
|
|
|
|
для: Anka
(18.08.2011 в 04:59)
| | Всё. Выспалась - сама разобралась:
SELECT CATEGORY.id, CATEGORY.id AS id_ext, nm, ti, ds, kw, kf FROM CATEGORY
LEFT OUTER JOIN CATEGORY_EXT
ON CATEGORY.id=CATEGORY_EXT.id
WHERE CATEGORY_EXT.id IS NULL
UNION
SELECT CATEGORY.id, CATEGORY.id AS id_ext, nm, ti, ds, kw, kf
FROM CATEGORY
JOIN CATEGORY_EXT ON CATEGORY.id=CATEGORY_EXT.id
WHERE ti='' OR ds='' OR kw='' OR kf=''
|
То есть надо было условия в ON, а не только WHERE задавать. | |
|
|
|