如何解决创建检查约束时如何替换变量?
我需要为新添加的行添加一个必填字段。但是,由于表很大,因此不希望为旧行设置默认值。我需要提供一个自动脚本来执行此操作。 我试过了,但是不起作用:
do $$
declare
max_id int8;
begin
select max(id) into max_id from transactions;
alter table transactions add constraint check_process_is_assigned check (id <= max_id or process_id is not null);
end $$;
解决方法
诸如ALTER TABLE
之类的实用程序命令不接受参数。仅基本DML命令SELECT
,INSERT
,UPDATE
,DELETE
可以执行。
参见:
- set "VALID UNTIL" value with a calculated timestamp
- “ERROR: there is no parameter $1” in “EXECUTE .. USING ..;” statement in plpgsql
- Creating user with password from variables in anonymous block
您需要动态SQL ,例如:
DO
$do$
BEGIN
EXECUTE format(
'ALTER TABLE transactions
ADD CONSTRAINT check_process_is_assigned CHECK (id <= %s OR process_id IS NOT NULL)',(SELECT max(id) FROM transactions)
);
END
$do$;
db 提琴here
这会基于 current 最大值CHECK
创建一个id
约束。
也许NOT VALID
constraint会更好?不会针对现有行进行检查:
ALTER TABLE transactions
ADD CONSTRAINT check_process_is_assigned CHECK (process_id IS NOT NULL) NOT VALID;
但是在这种情况下,您必须“修复”要更新的旧行。 (即,到目前为止,如果为process_id
赋值为NULL。)请参阅:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。