postgres中的pg_get_serial_sequence失败并返回误导性错误

时间:2019-10-21 06:26:25

标签: postgresql

这对我来说并不麻烦。

当我这样做时:

SELECT MAX("SequenceNumber") FROM "TrackingEvent";

返回正确的结果并正确显示

当我这样做时:

SELECT nextval(pg_get_serial_sequence("TrackingEvent", "SequenceNumber")) AS NextId

它返回一条错误消息

column "TrackingEvent" does not exist.

不仅错误,而且函数pg_get_serial_sequence的第一个参数使用表名而不是列名,因此该错误也容易引起误解。

无论如何,有人可以向我解释为什么我在pg_get_serial_sequence函数上遇到错误吗?

1 个答案:

答案 0 :(得分:1)

pg_get_serial_sequence()需要一个字符串作为其参数,而不是标识符。字符串常量在SQL中用单引号编写,"TrackingEvent"是标识符,'TrackingEvent'是字符串常量。

但是因为该函数将字符串常量转换为标识符,所以您需要在字符串常量中包括双引号。但是,这仅适用于表名,不适用于列名,例如explained in the manual

  

由于第一个参数可能是模式和表,因此不会将其视为双引号标识符,这意味着默认情况下将其小写,而将第二个参数(仅作为列名)视为双引号并保留其大小写。

因此您需要使用:

SELECT nextval(pg_get_serial_sequence('"TrackingEvent"', 'SequenceNumber'))

这是另一个很好的示例,为什么使用带引号的标识符为a bad idea。您应将"TrackingEvent"重命名为tracking_event,将"SequenceNumber"重命名为sequence_number