2016-09-06 3 views
0

Я создал две таблицы MySQL. Один из них импортирует CSV, называемый staging_part_type, и тот, где фактические part_type записи должны быть в конечном итоге вызваны part_type, за вычетом любых записей, которые уже присутствуют. product_code. Обе таблицы идентичны, состоящие из столбцов id, in_use, default_name, product_code.MySQL выбрать из одной таблицы, вставить в другую

Есть ли определенное имя для выполнения чего-то подобного? Я не нашел никаких полных руководств по этому поводу, только кучу отдельных, и я не могу собрать их в рабочий запрос, поскольку мне не хватает опыта в этой теме, и после недели чтения я все еще едва понимаю, что я 'я делаю.

Что-то вроде этого?

INSERT IGNORE INTO part_type (in_use, default_name, product_code) 
     SELECT (in_use, default_name, product_code) 
      FROM staging_part_type  
      WHERE part_type.product_code IS NOT staging_part_type.product_code; 

Код для создания таблицы, обе таблицы идентичны, за исключением имени.

CREATE TABLE IF NOT EXISTS `part_type` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `in_use` tinyint(1) NOT NULL, 
    `default_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `product_code` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=580 ; 

Может кто-нибудь объяснить мне, как это сделать или указать мне на ресурс на эту тему?

ответ

2

Как это часто бывает в SQL, есть два способа сделать это, с подзапросом и с соединением.

Метод подзапроса легче понять и написать, но метод соединения более эффективен и что вы будете делать, если это был критически важный запрос.

Поскольку вы просто импортировать простой CSV, мы будем использовать «связанный подзапрос» с «существует», который работает так:

INSERT INTO part_type (in_use, default_name, product_code) 
    SELECT in_use, default_name, product_code 
     FROM staging_part_type  
     WHERE NOT EXISTS 
      (SELECT product_code FROM part_type WHERE product_code = staging_part_type.product_code) 

Вы думали в правильном направлении, но вам нужно настроить два запроса и связать их вместе. Запрос в круглых скобках выполняется, и единственными результатами, которые возвращаются, являются те, которые еще не существуют в строке. Сначала попробуйте запустить вторую строку самостоятельно, чтобы увидеть, что вы вернете, а затем добавьте в первую строку, чтобы сделать вставку.

+0

Очень элегантно и точно, что мне нужно для этой ситуации, поскольку файл действительно очень маленький. В настоящее время я пытаюсь проделать свой путь через «Основы систем управления базами данных» Гилленсона. Это много, но я обязательно посмотрю, как Join отличается от Subquery. –

1

Типичный способ, чтобы начать с уникальным индексом/ограничения на part_type, а затем использовать on duplicate key update:

CREATE UNIQUE INDEX unq_part_type_product_code ON part_type(product_code); 

INSERT INTO part_type (in_use, default_name, product_code) 
    SELECT in_use, default_name, product_code 
    FROM staging_part_type 
    ON DUPLICATE KEY UPDATE product_code = VALUES(product_code); 

Преимущества этого метода. Во-первых, он работает, просматривая код продукта, используя уникальный индекс. Выполнение дополнительного поиска не требуется (но вы можете это сделать).

Во-вторых, SET является нерабочим, поэтому это не приводит к увеличению количества изменяемых записей.

В-третьих, это игнорирует ошибки, вызванные дублированием ключей (возможно, только product_code). Другие ошибки не игнорируются.

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

В-пятых, у этого нет условий гонки. База данных обеспечивает уникальность product_code.

+0

Мне нравится концепция этого, и я создал 'product_code' уникальный. Однако я получаю синтаксическую ошибку в части SET инструкции.на http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html, похоже, немного другой порядок, хотя он также, похоже, заменяет оригинал. –

+0

@ G_V. , , Это потому, что 'SET' не является частью синтаксиса. Он просто выглядит правильно после «UPDATE», поэтому я иногда добавляю его. –

Смежные вопросы