这对我来说并不麻烦。
当我这样做时:
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
函数上遇到错误吗?
答案 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