pg_copy_from

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

pg_copy_from 从数组中插入记录到表中

描述

pg_copy_from(
    PgSql\Connection $connection,
    string $table_name,
    array $rows,
    string $separator = "\t",
    string $null_as = "\\\\N"
): bool

pg_copy_from()rows 中将记录插入到表中。它在内部发出 COPY FROM SQL 命令来插入记录。

参数

connection

一个 PgSql\Connection 实例。

table_name

要将 rows 复制到的表的名称。

rows

要复制到 table_name 中的数据的 arrayrows 中的每个值都成为 table_name 中的一行。rows 中的每个值都应该是一个分隔符字符串,用于插入到每个字段中的值。值应该以换行符结尾。

separator

rows 中每个元素的每个字段中用于分隔值的标记。默认值为 \t

null_as

rows 中如何表示 SQL NULL 值。默认值为 \\N ("\\\\N")。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.1.0 connection 参数现在需要一个 PgSql\Connection 实例;以前需要一个 resource

范例

示例 #1 pg_copy_from() 示例

<?php
$db
= pg_connect("dbname=publisher") or die("Could not connect");

$rows = pg_copy_to($db, $table_name);

pg_query($db, "DELETE FROM $table_name");

pg_copy_from($db, $table_name, $rows);
?>

参见

添加说明

用户贡献的说明 10 个说明

7
karlo dot petravic at hotmail dot com
5 年前
作为表名,您也可以指定要导入的列。

将导入所有列
<?php
pg_copy_from
($db, 'cpm.ics', $rows);
?>

将仅导入指定的列
<?php
pg_copy_from
($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
1
Rainer Perske
1 年前
要解决参数 $separator 和 $null_as 需要使用多少个反斜杠的问题:反斜杠会解释两次,第一次由 PHP 解释,然后由 PostgreSQL 解释。所以写四个反斜杠来表示输入数据中的一个反斜杠。因此,\\\\N 和 \\\\N 都变为 NULL AS E'\\N',在内部使用的 SQL 语句中与 NULL AS '\N' 意义相同。

加载的输入数据必须使用反斜杠转义。根据 PostgreSQL 文档,您可以使用以下转义序列

\\ = 反斜杠 (ASCII 92)
\b = 退格键 (ASCII 8)
\t = 制表符 (ASCII 9)
\n = 换行符 (ASCII 10)
\v = 垂直制表符 (ASCII 11)
\f = 换页符 (ASCII 12)
\r = 回车符 (ASCII 13)
\000 (反斜杠后跟一个到三个八进制数字) = 具有该数字代码的字节
\x00 (反斜杠 x 后跟一个或两个十六进制数字) = 具有该数字代码的字节

使用默认设置,仅包含 \N(一个未转义的反斜杠和一个 N)的数据字段表示 NULL 值。此默认值 \N 被选中是因为它不会与正确编码的数据冲突。
1
smcbride at msn dot com
4 年前
使用此函数时,不要被双引号 (") 与单引号 (') 的区别困扰。这是一个小问题,但错误消息会误导人。如果您使用单引号,您将看到 \t 分隔的值都尝试插入到第一个字段中。

一个小小的考虑,但可以帮助那些工作到很晚,无法让这些函数正常工作的人。
1
匿名
15 年前
另请参阅:pg_put_line,它提供了一种无需缓冲所有要复制数据的解决方案。
0
Dave
10 年前
默认值为 "\\\N" 而不是 "\\N",至少在 php 5.4 中是这样。

pg_copy_from($db, $table_name, "\t", "\\\N")
0
vlad at php dot net
21 年前
默认情况下,NULL 值是一个反斜杠后跟一个大写 N("\\N")。

此外,您不能插入带有 OID 的条目(我已经将其添加到我的待办事项列表中)。
-1
Dave
12 年前
从 postgresql 9.1 开始,"standard_conforming_strings" 设置为 on

这将不再起作用
<?php
$copy_message
= "1\t\\N\t300";
pg_copy_from($db, "message", $copy_message);
?>
结果将在该字段中为 "N"。如果该字段允许文本,否则它将无法插入帖子。

简单的修复
<?php
$copy_message
= "1\t\\NULL\t300";
pg_copy_from($db, "message", $copy_message, "\t","\\NULL");
?>
-1
kapouer_php at melix dot org
16 年前
pg 语法是
COPY test (cola, colb, colc) FROM stdin;
...

此函数不允许您指定列的顺序!
-1
carl at thep.lu.se
21 年前
需要说明一下数组的格式。
从我所见来看,它几乎与您使用
file() 加载分隔符为制表符的文件时获得的结果相同。也就是说,
行以换行符结尾,并且不需要
带有 "\." 的额外行。另一方面,当我尝试使用此
命令时,与服务器的连接最终处于某种奇怪的
状态,然后丢失
PHP 警告: U?S?o() 查询失败: 服务器意外关闭连接

我认为现在使用较低级别的函数
pg_put_line() 可能会更安全。
-9
Dave
13 年前
修复“复制命令失败: ERROR: 在数据中发现字面回车符

"复制命令失败: ERROR: 缺少列的数据
"message" CONTEXT: COPY message, line 1:"

<?php
$message
= "HEJ\rHEJ\nHEJ\r\nHEJ\n\rHEJ\tHELLO\\";

$message = addslashes($message);

$message = str_replace(
array(
"\n","\r","\t"),
array(
"\\n","\\r","\\t"),
$message);

$copy_message = "1\t". $message ."\t300";

pg_copy_from($db, "message", $copy_message);
?>
To Top