我有一个名为base_types的表,其中包含以下约束:
ALTER TABLE public.base_types
ADD CONSTRAINT base_type_gas_type_fk FOREIGN KEY (gas_type)
REFERENCES public.gas_types (gas_type) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED;我有一个名为alarm_history的表,其中包含5个约束,其中包括以下约束:
ALTER TABLE public.alarm_history
ADD CONSTRAINT alarm_history_device_fk FOREIGN KEY (device)
REFERENCES public.bases (alarm_device) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED;我正在尝试将一个数据库从一个不关心任何奇怪和无用的东西(如约束)的数据库转换为一个使用它们的数据库。我从这个脚本开始:
delete from gas_types;
select conversion.convert_base_types();
alter table base_types validate constraint base_type_gas_type_fk;
select conversion.convert_alarm_history();
alter table alarm_history validate constraint alarm_history_base_fk;
alter table alarm_history validate constraint alarm_history_charge_fk;
alter table alarm_history validate constraint alarm_history_cooler_fk;
alter table alarm_history validate constraint alarm_history_device_fk;
alter table alarm_history validate constraint alarm_history_furnace_fk;我及时收到一条错误消息,告诉我新base_types记录中的gas_type字段与gas_types表中的任何内容都不匹配,因为gas_types表为空。但是如果我注释掉base_types命令,我会在alarm_history表中得到18,000条漂亮的新记录,尽管它们中的每一个都至少违反了该表的五个外键约束中的一个,因为这些键引用的所有表都是空的。我需要确保转换后的数据是一致的,因此我需要验证我的约束,但这显然不会发生。为什么不行?
发布于 2018-08-15 07:10:12
由于上面的约束是作为DEFERRABLE INITIALLY DEFERRED创建的,因此在提交DML语句( delete语句)之前不会检查它们,或者在您的情况下,直到显式验证约束时才会检查它们。
这是初始延迟可推迟约束的正常和预期操作。
要在当前事务中更改此功能,您可以发出SET CONSTRAINTS命令来更改以下内容:
SET CONSTRAINTS alarm_history_device_fk IMMEDIATE;
delete from gas_types;这将引发一个外键冲突,并在较早的时候提醒您,您有依赖于要删除的记录的数据。
https://stackoverflow.com/questions/51849647
复制相似问题