问题描述
我正在将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仍然会失败。