我在 PHP 数组/变量中有一些数据准备好通过 INSERT 语句插入到 PostgreSQL 表中。
举个简单的例子,假设我有以下信息:
$name= 'someName';
$time = array(1,2,3);
$elevation = array(100,200,300);
(在我的实际应用中,这些是 double 值,可能有 1,000 多个值)
我还有我的 postgresql 表,其中包含“name”、“time”、“elevation”列
我想将这些插入到单个 INSERT 语句中,并且已提供多种不同的方法来执行此操作。
- 循环并一次插入一个数据点(行)。
- 在数组上使用 unnest() 并执行一次插入(最快)
我的问题是我可以传递一个变量名和未嵌套的数组并在每一行(每个数组元素)中重复名称,或者我是否需要构造一个重复的数组来命名等效的 count() 作为其他阵列?
示例语句:
*cr_query 是我们使用的自定义 PHP pg_query 包装器
cr_query($conn,"INSERT INTO sometable (name,time,elevation) VALUES ({$name},{unnest($time)},{unnest($elevation)}););
这将插入到某个表中:
ID name time elevation
1 someName 1 100
2 someName 2 200
3 someName 3 300
我在这里是正确的还是需要做其他事情?
编辑:
假设我还有另一个变量“surface”。 Surface 可以是 double 值,也可以是 NULL。所以我想插入表中,看起来像这样:
ID name time elevation surface
1 someName 1 100 50
2 someName 2 200 NULL
3 someName 3 300 100
在 PHP 中,在 unnest 语句中使用 klin 在 array for surface 下面指定的方法将变为 unnest(array[50,,100]);这会引发如下错误:
(我的真实数据有误)
ERROR: syntax error at or near "," LINE 3: ...-6,5.75E-6,5.75E-6,5.75E-6,5.75E-6]),unnest(array[,,,,,,,,,]... ^
编辑 2:
既然所有的“编码”都在工作,一个新的问题又出现了。假设上面的示例列“surface”是 double 类型。
假设我要插入一个数组,但对于这个集合,所有数据都是空的。
关键部分是:
unnest(array[null,null,null,null,null,null,null,null,null,null])
但是,这个数组是字符串类型的。向它添加一个值,它就变成了那个数值的类型,但我需要能够处理这个。
我的问题是:如何将所有空值的未嵌套数组插入到 double 列中? (我尝试转换::double precision)但这是不可能的。
最佳答案
假设您的 cr_query() 函数没有做任何神奇的事情,您的代码将引发 postgres 语法错误。您可以使用 unnest 但您必须准备适当的查询文本。 试试你的代码:
$name= 'someName';
$time = array(1,2,3);
$elevation = array(100,200,300);
echo "INSERT INTO sometable (name,time,elevation) VALUES ".
"({$name},{unnest($time)},{unnest($elevation)})"
echo: INSERT INTO sometable (name,time,elevation) VALUES (someName,{unnest(Array)},{unnest(Array)})
显然这不是我们要发送给 postgres 的。如何修复?
$name= 'someName';
$time = array(1,2,3);
$elevation = array(100,200,300);
$timestr = 'array['. implode(',', $time). ']';
$elevstr = 'array['. implode(',', $elevation). ']';
echo "INSERT INTO sometable (name,time,elevation) ".
"VALUES ('$name',unnest($timestr),unnest($elevstr));"
echo: INSERT INTO sometable (name,time,elevation) VALUES ('someName',unnest(array[1,2,3]),unnest(array[100,200,300]));
我认为这是正确的查询。请注意,我用单引号将文本变量“$name”括起来。
如果数组中有空值,则必须将准备好的文本中的所有空字符串替换为“null”以供查询。 可能最简单的方法是使用 str_replace()。 随着转换变得越来越复杂,为此目的编写一个函数(比如“pgstr()”)会很方便。
function pgstr($array) {
$str =
str_replace('[,', '[null,',
str_replace(',]', ',null]',
'array['. implode(',', $array). ']'));
while (strpos($str, ',,') > 0) $str = str_replace(',,', ',null,', $str);
return $str;
}
$name= 'someName';
$time = array(1,2,3,4);
$elevation = array(100,null,300,null);
$surface = array(null,null,3.24,null);
$timestr = pgstr($time);
$elevstr = pgstr($elevation);
$surfstr = pgstr($surface);
echo
"INSERT INTO sometable (name,time,elevation,surface) ".
"VALUES ('$name',unnest($timestr),unnest($elevstr),unnest($surfstr));";
关于PHP 到 PostgreSQL 将未嵌套的数组插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528707/