Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres忽略插入错误并继续_Postgresql - Fatal编程技术网

Postgresql Postgres忽略插入错误并继续

Postgresql Postgres忽略插入错误并继续,postgresql,Postgresql,我有一个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 当我尝试使用

我有一个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
我得到这个错误:

错误:表“Car_Data_3PM”的插入或更新违反外键 约束“Car_Data_3PM_F_ID_fkey”SQL状态:23503详细信息:键 (F_ID)=(38)不在表“自行车数据”中

不插入任何行


我如何才能使Postgres只遗漏约束存在问题的行?i、 e是否插入其中大部分?

您不能让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)

您不能让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)

一种方法是编写一个触发器来过滤坏值,如下所示:

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

一种方法是编写一个触发器来过滤坏值,如下所示:

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();
不相关,但是:您应该真正避免引用标识符。它们比它们值得的麻烦多得多。不相关,但是:你真的应该避免引用标识符。他们比他们值得的麻烦多。