КОПИРОВАТЬ CSV-файл со столбцом идентификатора

У меня есть приложение rails, и я пытаюсь загрузить в него данные с помощью команды COPY PostgreSQL. Файл CSV. Таблица сопоставляется с моделью Rails, и мне нужно сохранить столбец идентификатора первичного ключа, чтобы я мог использовать model.for_each для обработки данных — в таблице будет более 5 миллионов строк.

Мой вопрос: как я могу структурировать свой CSV, чтобы я мог загружать данные в таблицу и по-прежнему разрешать наличие столбца идентификатора? Это облом, потому что единственная причина, по которой мне это нужно, - это метод for_each.

Несмотря на это, я попытался отправить NULL, например:

NULL,col1,col2,col3,col4, etc.

Но это не работает.

Спасибо.


person NJ.    schedule 14.03.2011    source источник
comment
Упс. Я пытаюсь '\N' передать NULL. Возможно, здесь проблема в моих давно минувших днях MS-SQL. Стоять рядом с...   -  person NJ.    schedule 14.03.2011
comment
Неа. \N тоже не работает.   -  person NJ.    schedule 14.03.2011


Ответы (2)


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

Я действительно понятия не имею, что вы подразумеваете под сохранением первичного ключа. Это то, что будет сохранено, что бы вы ни делали. Если вы имеете в виду, что БД выбирает значение для вас, а первичный ключ является серийным (автоинкремент), тогда явно укажите все столбцы, кроме первичного ключа:

COPY country (colA, colB, colC) FROM '/usr1/proj/bray/sql/country_data'; -- leave out pkey

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

http://www.postgresql.org/docs/9.0/static/sql-copy.html

person nate c    schedule 14.03.2011
comment
Спасибо. Это было полезно. Если вы видите мой комментарий к моему вопросу, да, вы совершенно правы. Я предположил, что это «NULL» вместо «\N». Спасибо. Вы знаете, что происходит, когда вы предполагаете... - person NJ.; 15.03.2011
comment
Интересно! Потому что в документации, которую я читал (усмехается), говорилось, что между таблицей и CSV-файлом должно быть сопоставление столбцов один к одному. Это заставило меня подумать, что я должен учитывать столбец идентификатора и не могу делать то, что вы говорите. Я попробую. Спасибо еще раз! - person NJ.; 15.03.2011

По умолчанию при использовании WITH CSV используется пустая строка без кавычек, например:

,col1,col2,col3,,col5

Что создаст запись, которая выглядит так:

NULL,'col1','col2','col3',NULL,'col5'
person Derek Arnold    schedule 14.03.2011
comment
Пробовал это с этим результатом: ОШИБКА: нулевое значение в идентификаторе столбца нарушает ненулевое ограничение - person NJ.; 15.03.2011
comment
Вам все равно придется соблюдать ограничение первичного ключа, даже если вы вводите NULL. Вам придется либо настроить схему, либо данные, чтобы они были совместимы. - person Derek Arnold; 15.03.2011