2016-10-03 10 views
0

ONYキャリー:私は使用して複数の値を挿入しようとするとPostgresは、私は次の制約でPostgeresDBを持って挿入エラーを無視して

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".

NO ROWSが挿入されます。

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();