0

我在尽可能自动地重置序列时遇到了麻烦。我正在尝试使用来自 phpPgAdmin 的下一个查询:

SELECT SETVAL('course_subjects_seq', (SELECT MAX(subject_id) FROM course_subjects));

不知何故,这个查询返回:

> HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

指向第一个SELECT SETVAL

下一个查询将给出相同的错误:

SELECT setval("course_subjects_seq", COALESCE((SELECT MAX(subject_id) FROM course_subjects), 1))

谁能指出我做错了什么?

4

2 回答 2

0

通过这样做修复:

setval 函数需要 regclass、bigint 和 boolean 作为参数,因此我添加了类型转换:

SELECT setval('course_subjects_seq'::regclass, COALESCE((SELECT MAX(subject_id) FROM course_subjects)::bigint, 1));

::regclass

::bigint

于 2019-08-14T18:43:43.153 回答
0

您在这里根本不需要子查询。可以是单人SELECT

SELECT setval(pg_get_serial_sequence('course_subjects', 'subject_id')
            , COALESCE(max(subject_id) + 1, 1)
            , false)  -- not called yet
FROM   course_subjects;

假设subject_id是一serial列,pg_get_serial_sequence()这很有用,因此您不必知道序列名称(实际上这是一个实现细节)。

SELECT使用聚合函数max() 总是返回单行,即使基础表没有行。在这种情况下,该值为 NULL,这就是您COALESCE在那里的原因。

但是如果你setval()用 1 调用,下一个序列返回的数字将是2,而不是 1,因为这被认为已经被调用了。有一个带有第三个布尔参数:的重载变体setval()is_called,这使得在这种情况下实际上可以从1开始,如演示的那样。

有关的:

于 2019-08-14T21:27:00.680 回答