Заполнение полей в существующих записях в 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
список.
Это решение было проверено и подтверждено ФП.