【问题标题】:postgres error that sequence doesn't exist but nextval returns value for sequencepostgres 错误,序列不存在,但 nextval 返回序列的值
【发布时间】:2020-02-19 12:33:39
【问题描述】:

我正在尝试更改一个表并且需要删除主键列然后重新创建它。这稍微复杂一些,因为我需要插入倒数第 4 列,最后 3 列需要保留在最后。

我正在执行以下脚本:

DO$$
BEGIN

ALTER TABLE logging.audit_study
    DROP CONSTRAINT audit_study_pkey,
    DROP COLUMN indication,
    ADD COLUMN indication INT,
    ADD COLUMN audit_study_id_tmp INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    ADD COLUMN aud_action_tmp VARCHAR,
    ADD COLUMN transaction_id_tmp BIGINT DEFAULT (TXID_CURRENT());

UPDATE logging.audit_study SET audit_study_id_tmp = audit_study_id;
UPDATE logging.audit_study SET aud_action_tmp = aud_action;
UPDATE logging.audit_study SET transaction_id_tmp = transaction_id;

ALTER TABLE logging.audit_study
    DROP COLUMN audit_study_id,
    DROP COLUMN aud_action,
    DROP COLUMN transaction_id;


ALTER TABLE logging.audit_study RENAME audit_study_id_tmp TO audit_study_id;
ALTER TABLE logging.audit_study RENAME aud_action_tmp TO aud_action;
ALTER TABLE logging.audit_study RENAME transaction_id_tmp TO transaction_id;

PERFORM SETVAL('logging.audit_study_audit_study_id_tmp_seq', (SELECT MAX(audit_study_id)+1 FROM logging.audit_study), true);

END $$

我收到以下错误:

[42P01] ERROR: relation "logging.audit_study_audit_study_id_tmp_seq" does not exist Where: PL/pgSQL function inline_code_block line 26 at PERFORM

但是,如果我执行

SELECT nextval('logging.audit_study_audit_study_id_tmp_seq')

我为下一个序列返回一个整数。该序列也列在表属性中。

我似乎无法理解为什么在这个脚本中,序列似乎消失了。

【问题讨论】:

  • 与您的问题无关,但是:为什么 DO 块?对于您正在做的事情来说,这似乎完全没有必要
  • setval(pg_get_serial_sequence('logging.audit_study','audit_study_id'), ...) 工作吗?
  • "* 我需要插入倒数第 4 列*" 没有意义。表中列的顺序无关
  • @a_horse_with_no_name 我认为DO 块将所有语句包装在事务中。因此,如果任何语句失败,所有操作都会回滚。如果有任何失败,我希望所有这些语句都回滚。这个用例不需要 DO 块吗?
  • 您不需要 DO 块将其包装到事务中,只需使用 begin transaction .... commit;

标签: postgresql


【解决方案1】:

删除声明为 SERIAL 数据类型(自动创建相关序列)的主键列也会删除相关序列。

【讨论】:

  • 但是ADD COLUMN audit_study_id_tmp INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY添加了一个序列
猜你喜欢
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多