例如,有一个名为“testtable”的表,它具有以下列:testint (integer) 和 testtext (varchar(30))。
我想做的几乎是这样的:
INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file'));
在阅读 postgresql 文档时,我只能找到 COPY TO/FROM 命令,但该命令适用于表,而不是单个列。
那么,我该怎么办?
例如,有一个名为“testtable”的表,它具有以下列:testint (integer) 和 testtext (varchar(30))。
我想做的几乎是这样的:
INSERT INTO testtable VALUES(15, CONTENT_OF_FILE('file'));
在阅读 postgresql 文档时,我只能找到 COPY TO/FROM 命令,但该命令适用于表,而不是单个列。
那么,我该怎么办?
如果此 SQL 代码是从您的编程语言动态执行的,请使用该语言的方法来读取文件,并执行普通的 INSERT 语句。
但是,如果此 SQL 代码旨在通过psql
命令行工具执行,则可以使用以下构造:
\设置内容`猫文件` INSERT INTO testtable VALUES(15, :'content');
请注意,此语法特定于psql
并使用cat
shell 命令。
PostgreSQL手册中有详细解释:
如果我正确理解您的问题,您可以将单个字符串读入临时表并将其用于插入:
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',这是不安全的(但一个很好的集合点;-)