Заполнение полей в существующих записях в postgresql с использованием идентификатора записи, чтобы определить, что и куда идет

Сценарий

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

Чего я пытаюсь достичь

Теперь, когда у меня есть таблица с отсутствующей информацией, как мне вернуть эту информацию обратно в таблицу postgresql?

Пример данных из таблицы Postgresql [product_product]

   id   create_date       weight    default_code     product_templ_id   ...
    1   2016-12-15 18:57       0    000-000000-000                  1   ...
    2   2016-12-16 19:00       0    000-000000-000                  2   ...
    3   2016-12-16 20:42       0    000-000000-000                 31   ...
    4   2016-12-16 20:43       0    000-000000-000                 31   ...
    5   2016-12-16 20:44       0    000-000000-000                 31   ...
    6   2016-12-16 20:45       0                                   31   ...
  ...   ................     ...    ..............                 31   ...
 1603   2016-12-16 21:51       0                                   31   ...
 1604   2016-12-16 21:52       0                                   31   ...

Примерный список рассчитанных номеров деталей

  id  default_code  
   6  000-000000-000
 ...  ..............
1604  000-000000-000

Что я пробовал

Итак, я установил ODBC-соединение с базой данных, связав таблицу в MS Access 2010. Я отфильтровал product_templ_id поле и отсортировано по id, чтобы соответствовать тому, что у меня было в моей электронной таблице Excel. Затем я скопировал номера деталей из default_code колонку и попытался вставить в начальную точку, но получил сообщение об ошибке, в котором я пытался вставить слишком много информации. Я понял, Access пытался вставить содержимое буфера обмена в одну ячейку. Не то поведение, на которое я надеялся.

Какой маршрут лучше?

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

--РЕДАКТИРОВАТЬ--

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

В результате я попробовал следующую команду:

COPY product_product (default_code) from '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '/n';

В результате чего:

ERROR:  extra data after last expected column
CONTEXT:  COPY product_product, line 2: "203;000-000000-000"

Я думаю, хорошо, я упоминаю одно поле, но мой CSV имеет два поля. Это потому, что я хочу убедиться, что импортированные default_code Поле связано с соответствующей записью.

Далее я попробовал:

COPY product_product FROM '/csv/file/location/file.csv' CSV HEADER delimiter ';' null '\n';

В результате чего:

ERROR:  duplicate key value violates unique constraint "product_product_pkey"
DETAIL:  Key (id)=(2) already exists.

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

Если бы я знал, как редактировать значение записи в postgresql, я мог бы написать скрипт для генерации необходимых команд для редактирования всех 1440 записей соответственно.

1 ответ

Решение

Вы должны экспортировать ваши данные в формате CSV и использовать pgAdmin или команду COPY в postgres для импорта ваших данных обратно в:

См. Этот пост для получения информации о том, как это сделать: https://stackoverflow.com/questions/19400173/how-should-i-import-data-from-csv-into-a-postgres-table-using-pgadmin-3

--РЕДАКТИРОВАТЬ--

После этого поста вы можете использовать свои навыки сценариев для создания следующего SQL-запроса:

UPDATE product_product
    SET default_code = CASE id
        WHEN 6 THEN 000-000000-000
        ...
        ...
        WHEN 1603 THEN 000-000000-000
        WHEN 1604 THEN 000-000000-000
        ELSE default_code
        END;

Затем с помощью pgAdmin подключитесь к вашей базе данных и выполните запрос. Это будет анализировать записи в product_product таблица и обновить default_code поле записи, соответствующее относительному id значение. Если id значение не в вашем списке, оно просто сохраняет default_code значение.

Этот пост заканчивает запрос дополнительным оператором:

        ...
        END
    WHERE id IN(6,...,...,1603,1604);

В этом конкретном случае нет необходимости перечислять конкретные id ценности. Кроме того, IN список более 1440 значений приведет к ошибке. Это нормально, потому что ELSE default_code заявление действует как ловушка, обработка id ценности не в нашем case список.

Это решение было проверено и подтверждено ФП.

Другие вопросы по тегам