2016-10-03 52 views
0

我有一个PostgeresDB具有以下约束:的Postgres忽略插入错误并进行ONY

CONSTRAINT "Car_Data_3PM_pkey" PRIMARY KEY ("F_ID", "Date"), 
    CONSTRAINT "Car_Data_3PM_F_ID_fkey" FOREIGN KEY ("F_ID") 
     REFERENCES "Bike_Data" ("F_ID") MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 

当我尝试使用插入多个值:

INSERT INTO "Car_Data_3PM" ("F_ID","Date","Price_Type","O","H","L","LT","EQ","V","NAD") VALUES (38,'2016-10-02 08:19:40.056679','x',0,0,0,112.145,0,0,112.145),(14,'2016-10-02 08:19:40.056679','x',0,0,0,5476,0,0,5476),(13,'2016-10-02 

我得到这个错误:

ERROR: insert or update on table "Car_Data_3PM" violates foreign key constraint "Car_Data_3PM_F_ID_fkey" SQL state: 23503 Detail: Key (F_ID)=(38) is not present in table "Bike_Data".

未插入行。

如何让Postgres只丢失约束条件成问题的行?即插入大部分?

+2

无关,但:您应该***避免引用标识符。他们是更加麻烦,然后他们是值得的。 –

回答

1

你不能让Postgres的忽略值,但是你可以重写你的语句不插入这些行:

INSERT INTO "Car_Data_3PM" ("F_ID","Date","Price_Type","O","H","L","LT","EQ","V","NAD") 
select * 
from (
    VALUES 
    (38,'2016-10-02 08:19:40.056679','x',0,0,0,112.145,0,0,112.145), 
    (14,'2016-10-02 08:19:40.056679','x',0,0,0,5476,0,0,5476), 
    ... -- all other rows 
) as x (id, date, price_type, o, h, l, lt, eq, v nad) 
where exists (select 1 
       from "Bike_Data" bd 
       where bd."F_ID" = x .id) 
1

一种方式是编写过滤掉坏的价值观,像这样的触发:

CREATE FUNCTION car_insert_filter() RETURNS trigger 
    LANGUAGE plpgsql AS 
$$BEGIN 
    IF EXISTS(SELECT 1 FROM "Bike_Data" WHERE "F_ID" = NEW."F_ID") 
    THEN 
     RETURN NEW; 
    ELSE 
     RAISE NOTICE 'Skipping row with "F_ID"=% and "Date"=%', 
     NEW."F_ID", NEW."Date"; 
     RETURN NULL; 
    END IF; 
END;$$; 

CREATE TRIGGER car_insert_filter 
    BEFORE INSERT ON "Car_Data_3PM" FOR EACH ROW 
    EXECUTE PROCEDURE car_insert_filter();