首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证约束有时验证,有时不验证

验证约束有时验证,有时不验证
EN

Stack Overflow用户
提问于 2018-08-15 04:56:06
回答 1查看 43关注 0票数 0

我有一个名为base_types的表,其中包含以下约束:

代码语言:javascript
复制
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个约束,其中包括以下约束:

代码语言:javascript
复制
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;

我正在尝试将一个数据库从一个不关心任何奇怪和无用的东西(如约束)的数据库转换为一个使用它们的数据库。我从这个脚本开始:

代码语言:javascript
复制
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条漂亮的新记录,尽管它们中的每一个都至少违反了该表的五个外键约束中的一个,因为这些键引用的所有表都是空的。我需要确保转换后的数据是一致的,因此我需要验证我的约束,但这显然不会发生。为什么不行?

EN

回答 1

Stack Overflow用户

发布于 2018-08-15 07:10:12

由于上面的约束是作为DEFERRABLE INITIALLY DEFERRED创建的,因此在提交DML语句( delete语句)之前不会检查它们,或者在您的情况下,直到显式验证约束时才会检查它们。

这是初始延迟可推迟约束的正常和预期操作。

要在当前事务中更改此功能,您可以发出SET CONSTRAINTS命令来更改以下内容:

代码语言:javascript
复制
SET CONSTRAINTS alarm_history_device_fk IMMEDIATE;
delete from gas_types;

这将引发一个外键冲突,并在较早的时候提醒您,您有依赖于要删除的记录的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51849647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档