Как объединить две таблицы в MySQL и где таблица 1 является основной

Как объединить две таблицы в MySQL? Я просмотрел несколько других сообщений на эту тему, но они не вдаются мне в подробности.

Я начинающий пользователь MySQL, так что потерпите меня, у меня есть основная таблица и временная таблица, которые выглядят так:

CREATE TABLE temp_import ( id int(11) NOT NULL auto_increment,
Name varchar(255) по умолчанию NULL,
MerchantID int(11) по умолчанию NULL,
SKU varchar(255) по умолчанию NULL,
PRIMARY КЛЮЧ (id) ) ENGINE=MyISAM AUTO_INCREMENT=765811 CHARSET ПО УМОЛЧАНИЮ=utf8;

Я вставляю данные во временную таблицу следующим образом:

LOAD DATA LOCAL INFILE \'29762.txt\' REPLACE INTO TABLE temp_import FIELDS TERMINATED BY \'|\' OPTIONALLY ENCLOSED BY \'"\' LINES TERMINATED BY \'\n\' (Name, MerchantID, SKU);

Формат каждой таблицы одинаков, но данные со временем меняются. У некоторых элементов данные случайны, но SKU остается постоянным. Некоторые товары больше не будут предлагаться и должны быть удалены из базы данных.

пример:

Текущая таблица базы данных:

1, dog, 101, dog101
2, cat, 101, cat101
3, chicken, 102, chicken100
4, chicken food, 102, chicken101

Новая таблица базы данных:

1, dog, 101, dog101
2, cat, 102, cat101
3, chicken, 102, chicken100
5, Frog, 103, frog101

Окончательный результат должен быть

1, dog, 101, dog101
2, cat, 102, cat101
3, chicken, 102, chicken100
5, Frog, 103, frog101

Удален цыпленок, добавлена ​​лягушка, обновлен кот.

Кроме того, это должно быть максимально эффективным. Я буду работать с огромными файлами. И это может быть только код MySQL.

http://www.xaprb.com/blog/2006/02/21/flexible-insert-and-update-in-mysql/ Я просмотрел это, но это выше моей головы, когда я пытаюсь это сделать, это не работает. ..


person Brad    schedule 08.06.2011    source источник
comment
Хороший! ... Но в чем твой вопрос?   -  person stefgosselin    schedule 08.06.2011
comment
@mu слишком короткий -› Да. Я тоже два раза прочитал пост! Вы понимаете, что пора спать, когда не видите вопрос в сообщении.   -  person stefgosselin    schedule 08.06.2011
comment
@stefgosselin Я отредактировал вопрос, чтобы вы его не пропустили.   -  person Brad    schedule 08.06.2011


Ответы (3)


Вместо этого сделайте SKU первичным ключом. Оттуда вы можете просто выполнить запрос INSERT ... SELECT ... ON DUPLICATE KEY UPDATE.

person Ignacio Vazquez-Abrams    schedule 08.06.2011
comment
а затем искать элементы, которых нет в 1-й таблице? - person Brad; 08.06.2011
comment
Конечно, но это легкая часть. Это просто NOT EXISTS. - person Ignacio Vazquez-Abrams; 08.06.2011

Не уверен, что это будет соответствовать вашим потребностям, но, похоже, вам может понадобиться просмотра ваших данных.

Представление базы данных известно как «виртуальная таблица», которая позволяет вам запрашивать данные в ней.

Вы можете найти отличную информацию о представлениях здесь. Я надеюсь, что это поможет, представления очень эффективны и заслуживают внимания, когда вам нужно другое представление ваших данных.

person stefgosselin    schedule 08.06.2011

Я думал, что опубликую то, что я в конечном итоге использовал для этого. Это, вероятно, не «ЛУЧШИЙ» способ, и удаление столбца совершенно необязательно.

ALTER TABLE `temp_import`
ADD `deleteme` tinyint NOT NULL
DEFAULT 0; -- If you haven't already added a deleteme column 


UPDATE `temp_import` SET  `deleteme` = 1; -- Set the delete field 

LOAD DATA LOW_PRIORITY LOCAL INFILE "import.csv" REPLACE INTO TABLE `temp_import`  FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY """" LINES TERMINATED BY "\n"  IGNORE 1 LINES (`id`, `name`, `m_id`, `sku`);

DELETE FROM `temp_import` WHERE  `deleteme` = 1;

ALTER TABLE `tests` DROP COLUMN `deleteme` -- Optional
person Brad    schedule 29.03.2012
comment
Единственная проблема заключается в том, что для больших существующих наборов данных часть UPDATE SET = 1 выполняется довольно медленно. - person Brad; 09.04.2012