PostgreSQL-COPY

问题描述

我正在将Excel中的数据导入PostgreSQL Db。该数据有很多错误,但是似乎可以连接多个表的一件事是customer_id。 但是,在customer表中,我有一个唯一的char(8),始终具有前导零。是的,如果要由我决定,我会强制这些数据在上游不是那么棘手,但是我正在与这里的销售人员,那里的制造,融资等打交道。 而且,客户ID ALMOST通过这些各种来源匹配!只是customer_id某些数据没有前导零,所以customers.id = '01234567'确实代表orders.customer_id = '1234567'

我在Postgres中使用COPY命令,这对我来说是新事物。不幸的是,由于这种微小的差异,我无法在customer.id上定义外键关系。

如何进行COPY并告诉列值添加前导零?这可能吗?我希望我可以在COPY语句中正确执行此操作?感谢您对如何执行此操作有任何见识!

编辑: 注释将我引向了本文档。我弄清楚这一点后,我将提供一个答案。看来ON BEFORE INSERT是我所需要的。

CREATE TRIGGER trigger_name 
   {BEFORE | AFTER} { event }
   ON table_name
   [FOR [EACH] { ROW | STATEMENT }]
       EXECUTE PROCEDURE trigger_function

解决方法

我是原始海报,这是我的问题的答案。我将数据从XLS导入PG,而将XLS导出到CSV以将COPY导入PG时,customer_id的前导零被删除了。 感谢您在这里给出的答案,该答案的确为我指明了正确的方向:Postgresql insert trigger to set value

-- create table
CREATE TABLE T (customer_id char(8));

-- draft function to be used by trigger. NOTE the double single quotes.
CREATE FUNCTION lpad_8_0 ()
RETURNS trigger AS '
BEGIN
  NEW.customer_id := (SELECT LPAD(NEW.customer_id,8,''0''));
  RETURN NEW;
END' LANGUAGE 'plpgsql';

-- setup on before insert trigger to execute lpad_8_0 function
CREATE TRIGGER my_on_before_insert_trigger
BEFORE INSERT ON T
FOR EACH ROW
EXECUTE PROCEDURE lpad_8_0();

-- some sample inserts
INSERT INTO T
VALUES ('1234'),('7');

这是一个有用的小提琴:http://sqlfiddle.com/#!17/a176e/1/0 注意:如果此处的值大于char(8),则COPY仍然会失败。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...