2016-10-03 3 views
0

ich eine PostgeresDB mit folgenden Maßgabe habe:Postgres ignorieren Einsatz Fehler und tragen 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 

Wenn ich versuche, mehrere Werte einfügen mit:

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 

ich diesen Fehler:

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

KEINE ZEILE eingefügt.

Wie kann ich machen, dass Postgres NUR die Zeilen verpasst, in denen die Einschränkung ein Problem ist? d. h. die meisten von ihnen einfügen?

+2

Nicht verwandt, aber: Sie sollten wirklich *** zitierte Bezeichner vermeiden. Sie sind viel mehr Ärger als sie es wert sind. –

Antwort

1

Sie können nicht Postgres machen die Werte ignorieren, aber Sie Ihre Aussage die Zeilen nicht einfügen umschreiben kann:

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

Eine Möglichkeit, einen Auslöser zu schreiben, ist, dass die schlechten Werte herausfiltert, wie folgt aus:

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