Postgres可以指定哪个字段触发了错误吗?

时间:2017-07-29 15:58:29

标签: postgresql

我们说我运行这样的查询(只是一个简单的例子):

update foo_table set field1=10000000000000, field2=100000000000000 where id=1;

我得到了

ERROR:  integer out of range

我怎么知道"超出范围"字段为field1还是field2?是否有设置来获取更具体的错误消息?

1 个答案:

答案 0 :(得分:2)

PostgreSQL通常可以告诉你哪个字段触发了错误。但在这种情况下,没有字段触发错误,所以它不能。在发生错误的阶段,正在解析文字,PostgreSQL还不知道它们被分配到字段。

但是,你应该得到一个比这更好的错误。考虑一下,例如

val joinDf=DF1.join(DF2, Seq("ColA"),"outer")
  .withColumn("newCol", when(DF1("ColB").isNull, col("ColC"))
  .otherwise(col("ColB")))
  .select(col("colA"),col("newCol"))

+----+--------------+
|colA|newCol        |
+----+--------------+
|1   |[[1,2], [1,3]]|
|3   |[[2,5], [3,4]]|
|2   |[[2,3], [3,4]]|
+----+--------------+

root
 |-- colA: integer (nullable = true)
 |-- newCol: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- _1: integer (nullable = false)
 |    |    |-- _2: integer (nullable = false)

(PostgreSQL 9.5)。

它可能无法显示此字段,但它应显示问题值和错误光标,如第一个示例。如果我有空的话,我会看看能否找到原因并提交补丁。

同时您可以通过引用整数值来解决它,以便将它们解析为未知类型的文字然后转换:

test=>     SELECT INTEGER '10000000000000', INTEGER '100000000000000';
ERROR:  value "10000000000000" is out of range for type integer
LINE 1: SELECT INTEGER '10000000000000', INTEGER '100000000000000';

(是的,这是SQL标准的)

两个调用的失败站点肯定是不同的:

test=> update foo set field1=10000000000000, field2=100000000000000 where id=1;
ERROR:  integer out of range