创建检查约束时如何替换变量?
How to substitute a variable when creating a check constraint?
我需要为新添加的行添加必填字段。但是,由于 table 的大小较大,因此不希望为旧行设置默认值。我需要提供一个自动脚本来执行此操作。
我试过这个,但它不起作用:
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
可以。
参见:
你需要动态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<>fiddle here
这会根据 当前 最大值 id
.
创建一个 CHECK
约束
也许 NOT VALID
constraint 会更好?未针对 现有行 :
检查
ALTER TABLE transactions
ADD CONSTRAINT check_process_is_assigned CHECK (process_id IS NOT NULL) NOT VALID;
但在这种情况下,您必须“修复”更新的旧行。 (即,如果到目前为止为 NULL,则将值分配给 process_id
。)参见:
我需要为新添加的行添加必填字段。但是,由于 table 的大小较大,因此不希望为旧行设置默认值。我需要提供一个自动脚本来执行此操作。 我试过这个,但它不起作用:
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
可以。
参见:
你需要动态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<>fiddle here
这会根据 当前 最大值 id
.
CHECK
约束
也许 NOT VALID
constraint 会更好?未针对 现有行 :
ALTER TABLE transactions
ADD CONSTRAINT check_process_is_assigned CHECK (process_id IS NOT NULL) NOT VALID;
但在这种情况下,您必须“修复”更新的旧行。 (即,如果到目前为止为 NULL,则将值分配给 process_id
。)参见: