2012-06-10 3 views
11

Например, существует таблица с именем testtable, которая имеет следующие столбцы: testint (integer) и testtext (varchar (30)).Postgresql: вставка значения столбца из файла

Что я хочу сделать, это довольно много что-то вроде этого:

INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file')); 

При чтении PostGreSQL документации, все, что я смог найти COPY TO/FROM команды, но тот, примененной к таблицам, а не одиночные колонки.

Итак, что мне делать?

+0

Файл должен содержать только одну строку = строка = столбец = поле? – wildplasser

+0

Да, файл содержит только одну строку, содержащую ничего, кроме этой строки. – user905747

+0

Хорошо, см. Ответ. (Я догадался) – wildplasser

ответ

2

Если я правильно понимаю ваш вопрос, вы можете прочитать одну строку (ы) в временную таблицу и использовать его для вставки:

DROP SCHEMA str CASCADE; 
CREATE SCHEMA str; 

SET search_path='str'; 

CREATE TABLE strings 
    (string_id INTEGER PRIMARY KEY 
    , the_string varchar 
    ); 
CREATE TEMP TABLE string_only 
    (the_string varchar 
    ); 

COPY string_only(the_string) 
FROM '/tmp/string' 
    ; 

INSERT INTO strings(string_id,the_string) 
SELECT 5, t.the_string 
FROM string_only t 
    ; 

SELECT * FROM strings; 

Результат:

NOTICE: drop cascades to table str.strings 
DROP SCHEMA 
CREATE SCHEMA 
SET 
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "strings_pkey" for table "strings" 
CREATE TABLE 
CREATE TABLE 
COPY 1 
INSERT 0 1 
string_id |  the_string  
-----------+--------------------- 
     5 | this is the content 
(1 row) 

Пожалуйста, обратите внимание, что файл «рассматривается» сервером, поскольку сервер видит файловую систему. «Текущая директория» с этой точки зрения, вероятно, $ PG_DATA, но вы ничего не должны принимать и укажите полный путь, , который должен быть загружен и доступен для чтения сервером. Вот почему я использовал «/ tmp», который небезопасен (но отличная точка rendez-vous ;-)

+0

Сначала это сработало. Затем я сделал это сам. [CODE] CREATE TABLE test ( testint INTEGER PRIMARY KEY NOT NULL, testtext TEXT ); CREATE TEMP TABLE загрузчик ( testtext ТЕКСТ НЕТ ); Копировальный загрузчик (тестовый текст) FROM '/Users/netaro/Untitled.txt'; INSERT INTO test SELECT 4, t.testtext с загрузчика t; SELECT * от испытания; [/ CODE] В INSERT INTO, я получаю [CODE] ОШИБКИ: продублировать значение ключа нарушает ограничение уникальности "test_pkey" SQL состояние: 23505 Детали: Ключ (testint) = (4) уже существует. [/ CODE] Кстати, что это такое, если вы отбрасываете схему и SET search_str? – user905747

+0

У меня есть привычка создавать временную схему для проведения подобных экспериментов. (это очевидно, чтобы избежать загрязнения схемы по умолчанию). Вы можете игнорировать первые три строки схемы и search_path. Ваша ошибка указывает, что ключевое значение «4» уже существует, когда вы намерены вставить его. Это не ошибка, а только данные защищены первичным ключом («уникальным») ограничением. – wildplasser

16

Если этот код SQL выполняется динамически с вашего языка программирования, используйте средства этого языка для чтения файла , и выполните простой оператор INSERT.

Однако, если этот SQL код предназначен для выполняться с помощью инструмента psql командной строки, вы можете использовать следующую конструкцию:

 
\set content `cat file` 
INSERT INTO testtable VALUES(15, :'content'); 

Обратите внимание, что этот синтаксис специфичный для psql и делает использование cat оболочки.

Он подробно описан в руководстве по PostgreSQL:

+1

Это сработало для меня! – Bryan

+1

@elimisteve Кажется, у вас другой вариант использования, чем тот, который задан в вопросе. Речь идет о вводе всего содержимого файла в одно поле в базе данных. – vog

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