PHP 日本研討會 2024

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 的資料 陣列rows 中的每個值都會成為 table_name 中的一列。 rows 中的每個值都應該是要插入到每個欄位的分隔字串。值應以換行符號終止。

separator

分隔 rows 中每個元素中每個欄位值的符號。預設值為 \t

null_as

SQL NULL 值在 rows 中的表示方式。預設值為 \\N ("\\\\N")。

傳回值

成功時傳回 true,失敗時傳回 false

變更記錄

版本 描述
8.1.0 connection 參數現在期望 PgSql\Connection 實例;先前,預期是 資源

範例

範例 #1 pg_copy_from() 範例

<?php
$db
= pg_connect("dbname=publisher") or die("無法連線");

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

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

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

另請參閱

新增註解

使用者貢獻的註解 9 則註解

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 = Tab 鍵 (ASCII 9)
\n = 換行符號 (ASCII 10)
\v = 垂直 Tab 鍵 (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 年前
至少在 php 5.4 中,預設值為 "\\\N" 而非 "\\N"

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」設定為開啟

這將不再起作用
<?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
17 年前
pg 語法是
COPY test (cola, colb, colc) FROM stdin;
...

這個函式不讓你指定欄位的順序!
-1
carl at thep.lu.se
22 年前
關於陣列的格式需要說明一下。
根據我所見,它很像你從
使用 file() 載入 Tab 分隔檔案所得到的結果。也就是說,
行尾以換行符號終止,並且不需要額外加入
"\." 行。另一方面,當我嘗試使用這個
指令時,連線到伺服器的狀態會變得有點奇怪,
然後就斷線了。
PHP 警告:U?S?o() 查詢失敗:伺服器意外關閉連線

我認為現在使用較底層的函式
pg_put_line() 可能會比較安全。
To Top