【发布时间】:2021-07-27 15:14:16
【问题描述】:
在迁移程序中,我对 table_1 执行插入查询,其定义如下:
CREATE TABLE table_1
(
col1 character varying(4) COLLATE pg_catalog."default" NOT NULL,
col2 character varying(10) COLLATE pg_catalog."default" NOT NULL,
col3 character varying(10) COLLATE pg_catalog."default" NOT NULL,
col4 character varying(40) COLLATE pg_catalog."default" NOT NULL,
col5 date NOT NULL,
col6 date NOT NULL,
CONSTRAINT table_1_pkey
PRIMARY KEY (col1, col2, col3, col4, col5, col6),
CONSTRAINT table_2_fkey FOREIGN KEY (col4)
REFERENCES table_2 (col1) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION,
CONSTRAINT table_3_fkey FOREIGN KEY (col3)
REFERENCES table_3(col1) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION
NOT VALID
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
现在当我尝试插入此表时,我收到此错误:
事务错误中的错误:在表“table_1”上插入或更新违反了外键约束“table_2_fkey”
我尝试以这种形式进行插入查询:
INSERT INTO table_1(col1, col2, col3, col4, col5, col6)
VALUES
(col1_value1, col2_value1, col3_value1, col4_value1, col5_value1, col6_value1),
(col1_value2, col2_value2, col3_value2, col4_value2, col5_value2, col6_value2),
(col1_value3, col2_value3, col3_value3, col4_value3, col5_value3, col6_value3)
ON CONFLICT (col1, col2, col3, col4, col5, col6) DO NOTHING;
有没有办法防止违反外键约束(跳过它们)?
类似ON VIOLATION DO NOTHING。
注意:它不违反第二个外键约束,因为我用我尝试填充到 table_1 的行来填充这个表 (table_2) 中的数据(用于规范化)。 table_2 是一个早先存在的表,我在另一个程序中填充了那里的行,所以那里可能缺少数据,我想跳过向 table_1 插入与 table_2 的外键不匹配的行。
使用 PostgreSQL 10.16,由 Visual C++ build 1800 编译,64 位
【问题讨论】:
标签: sql postgresql