PostgreSQL-副本上的左填充值

PostgreSQL-副本上的左填充值,postgresql,copy,pad,Postgresql,Copy,Pad,我正在将Excel中的数据导入PostgreSQL数据库。这个数据有很多错误,但是有一个似乎连接了多个表的东西是customer\u id。 然而,在customer表中,我有一个唯一的字符(8),它总是有一个前导零。是的,如果由我来决定的话,我会强制执行这些数据,而不是像上游那么混乱,但我正在与这里的销售人员、那里的制造人员、融资人员等打交道。 而且,客户id几乎通过这些不同的来源匹配!只是客户id某些数据没有前导零,因此customers.id='01234567'表示订单。客户id='12

我正在将Excel中的数据导入PostgreSQL数据库。这个数据有很多错误,但是有一个似乎连接了多个表的东西是
customer\u id
。 然而,在
customer
表中,我有一个唯一的字符(8),它总是有一个前导零。是的,如果由我来决定的话,我会强制执行这些数据,而不是像上游那么混乱,但我正在与这里的销售人员、那里的制造人员、融资人员等打交道。 而且,客户id几乎通过这些不同的来源匹配!只是客户id某些数据没有前导零,因此
customers.id='01234567'
表示
订单。客户id='1234567'

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

如何进行复制并告诉列值添加前导零?这可能吗?我希望我能在副本声明中做对吗?感谢您对如何做到这一点的任何见解

编辑: 一条注释将我引向此文档。在我弄明白这一点后,我会更新一个答案。我需要的是插入前打开的

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

我是原始海报,这是我问题的答案。我将数据从XLS导入PG,在将XLS导出到CSV以便复制到PG时,客户id上的前导零被删除。 感谢这里的答案,它确实为我指明了正确的道路:

这是一把小提琴:
注意:如果此处的值大于char(8),复制仍将失败。

您不能在
COPY
中执行此操作。您可以在表格上为该列创建一个插入时
触发器,并让触发器功能填充id。其余7位中是否有前导零?否则,您可以将值强制转换为整数。将列定义为整数(可能需要验证excel,我从不信任excel)。如果必须使用前导0,则在选择列时使用lpad。但这仍然允许使用外键。如果用户回退,则他们可以拥有正确的日期,也可以拥有前导的0,但不能两者都有。看起来这将使我学会如何忽略复制操作上的外键不匹配,如果我要使用on INSERT来修复问题。谢谢@Adrian,这是处理混合系统的成本。我有一个类似的情况,数据在空间中填充为固定的字符串大小,并用于对同一字段使用
varchar
的表。我使用触发器来清除多余的空间,一切都很好。
-- 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');