COPY и SERIAL

Konrad
Дата: 13.11.2003 09:21:23
Приветствую всех!

Исходная задача. Регулярно (с периодичностью 2 раза в сутки) необходимо получать данные, снимаемые с датчиков технологических процессов производства. Полученные данные нужно сохранить в таблицах БД.

Как это работает. Данные снимаются программой, написанной для терминалов, и к моему серверу БД никакого отношения не имеющей. Ребята, писавшие в свое время данную программу, готовы ее доработать таким образом, чтобы она выкладывала по ftp-протоколу эти данные с нужной периодичностью в файл (обычный, flat).

Планир(овал?)ую реализовать регулярную заливку полученных файлов в таблицы с помощью cron командой COPY. Но в данном решении есть подводные камни - автоинкрементные столбцы таблиц. Так как сама по себе команда COPY не дает возможности указывать набор атрибутов, оперируя в каждом случае всей таблицей, то рассинхронизация уникальных идентификаторов, генерируемых с помощью последовательностей, обеспечена. Соответственно, в лучшем случае по завершении COPY я получу сбитое значение nextval, в худшем - команда вообще не пройдет из-за дублирующихся ключей (в любом случае, оба варианта заведомо неприемлемы, поэтому что хуже, а что лучше - это все условно-относительно).

Заставлять программистов АСУТП генерировать файлы с готовыми наборами SQL-команд мне пока не хочется :), изначально я расчитывал на простые текстовые файлы данных с разделителями.

Есть какие-нибудь идеи, как обойти проблему?
Konrad
Дата: 13.11.2003 09:28:21
Возможно, как выход: файл -> временная таблица -> основная таблица. Но, возможно, проблему можно решить более изящно (или эффективно)..
LeXa NalBat
Дата: 13.11.2003 11:48:50
В команде COPY можно указывать список полей таблицы.
Konrad
Дата: 13.11.2003 11:55:58
2 LeXa NalBat
Версия PG?

7.2.1., по-моему, не позволяет


db=# \h copy
Команда: COPY
Описание: copy data between files and tables
Синтаксис:
COPY [ BINARY ] table [ WITH OIDS ]
FROM { 'filename' | stdin }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ]
COPY [ BINARY ] table [ WITH OIDS ]
TO { 'filename' | stdout }
[ [USING] DELIMITERS 'delimiter' ]
[ WITH NULL AS 'null string' ]
LeXa NalBat
Дата: 13.11.2003 12:10:23
Версия 7.3. В 7.2 этого действительно не было. :(
Konrad
Дата: 13.11.2003 12:57:42
OK, спасибо! Сам, наверное, и не полез бы смотреть наличие нужной мне функциональности в более поздних версиях :)

Теперь, пожалуй, окончательного релиза 7.4 дожидаться не буду (планировал дотянуть) :)
Shweik
Дата: 13.11.2003 14:49:53
Думаю что более быстрого решени чем COPY не найти -
особенно если файл на вход тебе генерит программа с железки, а
не оператор, путающий тройки с девятками 8)) .
PostgreSQL 7.3 Documentation:
Name
COPY -- copy data between files and tables
Synopsis
COPY table [ ( column [, ...] ) ]
FROM { 'filename' | stdin }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ] ]
COPY table [ ( column [, ...] ) ]
TO { 'filename' | stdout }
[ [ WITH ]
[ BINARY ]
[ OIDS ]
[ DELIMITER [ AS ] 'delimiter' ]
[ NULL [ AS ] 'null string' ] ]