postgresql - 当 COALESCE() 应确保不为空时,为什么会违反此 NOT NULL 约束?
问题描述
我有一个大约 20 行的 PostgreSQL 表。我正在尝试从另一个模式中的类似表中将数据导入其中。源表具有空值字段。目标表不允许其中一些为空值。我正在使用 COALESCE 将任何空值替换为默认值。但是,当我尝试导入一行时,我得到一个 NOT NULL 约束违规。
如果我删除表中除主键和不可为空的列之外的所有列,则查询有效!
这是插入查询:
insert into alarm_history_minimum
(alarm_history_pkey, area)
select alarm_pkey,coalesce(area, 'All'::character varying)
from old_public.alarm_history
where alarm_pkey = 82234;
这是最小化的表:
CREATE TABLE public.alarm_history_minimum
(
alarm_history_pkey bigint NOT NULL,
area character varying(32) COLLATE pg_catalog."default" NOT NULL DEFAULT 'All'::character varying
)
这是完整的表格:
CREATE TABLE public.alarm_history
(
alarm_history_pkey bigint NOT NULL,
area character varying(32) COLLATE pg_catalog."default" NOT NULL DEFAULT 'All'::character varying,
device character varying(32) COLLATE pg_catalog."default",
alarm_number smallint NOT NULL DEFAULT 0,
tag character varying(32) COLLATE pg_catalog."default",
state smallint NOT NULL,
message text COLLATE pg_catalog."default",
alarm_date timestamp with time zone,
charge integer,
ack_date timestamp with time zone,
ack_state integer NOT NULL DEFAULT 0,
furnace character varying(32) COLLATE pg_catalog."default",
cooling_cover character varying(32) COLLATE pg_catalog."default",
heating integer,
base character varying(32) COLLATE pg_catalog."default",
CONSTRAINT alarm_history_pk PRIMARY KEY (alarm_history_pkey),
CONSTRAINT alarm_history_base_fk FOREIGN KEY (area, base)
REFERENCES public.bases (area, base) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT alarm_history_charge_fk FOREIGN KEY (charge)
REFERENCES public.charges (charge) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT alarm_history_cooler_fk FOREIGN KEY (cooling_cover, area)
REFERENCES public.cooling_covers (cover, area) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED,
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,
CONSTRAINT alarm_history_furnace_fk FOREIGN KEY (furnace, area)
REFERENCES public.furnaces (furnace, area) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED
)
解决方案
我忘记了我的 alarm_history 表有一个触发器。空值来自由该触发器更新的表。在这次转换工作中,那个触发器曾经咬过我,我忘记了。
感谢那些发布问题和评论的人,并为我自己的白痴弄乱了列表而道歉。再次。
推荐阅读
- python - Python Pandas 'Dataframe.to_excel' 保存数据问题
- java - 带有配置文件的 Spring Boot Maven 多模块项目 - 未找到来自其他模块的包
- javascript - 如果在地图功能内:出现意外错误
- neo4j - GraphAware 荷兰语对 neo4j 3.5 的支持
- kotlin - java.lang.UnsupportedOperationException:Kotlin 反射尚不支持包和文件外观
- python-3.x - 防止 Bottle 的后端服务器插件(gunicorn)拦截命令行参数
- sql - 试图修复一个简单的 pl/sql 查询
- swift - 将字符串解析为字符串数组
- python-3.x - 如何在 OpenPyXL 中取消组合列和单元格
- visual-studio-code - 尽管我使用推荐的 rpm 方式,但没有安装 VSCode - Fedoa 29