【问题标题】:Postgres ignore insert error and carry onPostgres 忽略插入错误并继续
【发布时间】:2016-10-03 08:55:45
【问题描述】:

我有一个具有以下约束的 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) 不在表“Bike_Data”中。

没有插入任何行。

我怎样才能让 Postgres 只漏掉存在约束问题的行?即插入大部分?

【问题讨论】:

  • 不相关,但是:您应该真的避免使用带引号的标识符。他们的麻烦比他们值得的要麻烦得多。

标签: postgresql


【解决方案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)

【讨论】:

    【解决方案2】:

    一种方法是编写一个过滤掉错误值的触发器,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多