【发布时间】:2013-01-25 19:08:24
【问题描述】:
我有一些 PHP 数组/变量中的数据准备通过 INSERT 语句插入到 PostgreSQL 表中。
举个简单的例子,假设我有以下信息:
$name= 'someName';
$time = array(1,2,3);
$elevation = array(100,200,300);
(在我的实际应用中,这些是双精度,可能有 1000 多个值)
我的 postgresql 表也有列“名称”、“时间”、“海拔”
我想将这些插入到单个 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 可以是双精度值,也可以为 NULL。所以我想插入到表格中,看起来像这样:
ID name time elevation surface
1 someName 1 100 50
2 someName 2 200 NULL
3 someName 3 300 100
在 PHP 中,在 unnest 语句中使用 klin 规定的方法在表面数组下方将变为 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:
现在所有的“编码”都在工作,出现了一个新问题。假设上面的示例列“表面”是双精度类型。
假设我正在插入一个数组,但是对于这个集合,所有数据都是空的。
最重要的部分是:
unnest(array[null,null,null,null,null,null,null,null,null,null])
但是,这个数组是字符串类型的。向它添加一个值,它就会成为该数值的类型,但我需要能够处理它。
我的问题是:如何将所有空值的未嵌套数组插入双精度列? (我尝试投射 ::double 精度)但这是不可能的。
【问题讨论】:
标签: php arrays postgresql insert