18

例如,有一个名为“testtable”的表,它具有以下列:testint (integer) 和 testtext (varchar(30))。

我想做的几乎是这样的:

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

在阅读 postgresql 文档时,我只能找到 COPY TO/FROM 命令,但该命令适用于表,而不是单个列。

那么,我该怎么办?

4

2 回答 2

26

如果此 SQL 代码是从您的编程语言动态执行的,请使用该语言的方法来读取文件,并执行普通的 INSERT 语句。

但是,如果此 SQL 代码旨在通过psql命令行工具执行,则可以使用以下构造:

\设置内容`猫文件`
INSERT INTO testtable VALUES(15, :'content');

请注意,此语法特定于psql并使用catshell 命令。

PostgreSQL手册中有详细解释:

于 2013-01-02T14:08:11.937 回答
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',这是不安全的(但一个很好的集合点;-)

于 2012-06-10T10:55:59.873 回答