作為資料表名稱,您也可以指定您要匯入的欄位。
將匯入所有欄位
<?php
pg_copy_from($db, 'cpm.ics', $rows);
?>
將僅匯入指定的欄位
<?php
pg_copy_from($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)
pg_copy_from — 從陣列將記錄插入資料表
$connection
,$table_name
,$rows
,$separator
= "\t",$null_as
= "\\\\N"
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"
)。
版本 | 描述 |
---|---|
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);
?>
作為資料表名稱,您也可以指定您要匯入的欄位。
將匯入所有欄位
<?php
pg_copy_from($db, 'cpm.ics', $rows);
?>
將僅匯入指定的欄位
<?php
pg_copy_from($db, 'cpm.ics (type, product, date, count, amount)', $rows);
?>
為了解決如何為參數 $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 是因為它不會與正確編碼的資料衝突。
使用此函式時,請勿被雙引號 (") 與單引號 (') 的差異所困擾。這是一件小事,但錯誤訊息會造成誤導。如果您使用單引號,您會看到以 \t 分隔的值全部嘗試插入到第一個欄位中。
這是一個小小的考量,但將會拯救那些工作到很晚並且無法讓這些函式正常運作的人。
截至 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");
?>
pg 語法是
COPY test (cola, colb, colc) FROM stdin;
...
這個函式不讓你指定欄位的順序!
關於陣列的格式需要說明一下。
根據我所見,它很像你從
使用 file() 載入 Tab 分隔檔案所得到的結果。也就是說,
行尾以換行符號終止,並且不需要額外加入
"\." 行。另一方面,當我嘗試使用這個
指令時,連線到伺服器的狀態會變得有點奇怪,
然後就斷線了。
PHP 警告:U?S?o() 查詢失敗:伺服器意外關閉連線
我認為現在使用較底層的函式
pg_put_line() 可能會比較安全。