【发布时间】: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