从STDIN复制PostgreSQL无效,但从PATH复制有效

从STDIN复制PostgreSQL无效,但从PATH复制有效,sql,linux,postgresql,cat,Sql,Linux,Postgresql,Cat,在PostgreSQL中,我之前创建了如下表: CREATE TABLE IF NOT EXISTS stock_data ( code varchar, date date, open decimal, high decimal, low decimal, close decimal, volume decimal, UNIQUE (code, date) ); 其想法是将多个csv文件导入此表。我的方法是使用复制。。。从标准输入而不是复制。。。从“/path

在PostgreSQL中,我之前创建了如下表:

CREATE TABLE IF NOT EXISTS stock_data (
  code varchar,
  date date,
  open decimal,
  high decimal,
  low decimal,
  close decimal,
  volume decimal,
  UNIQUE (code, date)
);
其想法是将多个csv文件导入此表。我的方法是使用复制。。。从标准输入而不是复制。。。从“/path/to/file”,因为我希望能够从shell中
cat
多个csv文件,并将它们通过管道传输到sql脚本。完成此操作的sql脚本当前如下所示:

CREATE TEMPORARY TABLE IF NOT EXISTS stock_data_tmp (
  code varchar,
  ddate varchar,
  open decimal,
  high decimal,
  low decimal,
  close decimal,
  volume decimal,
  UNIQUE (code, ddate)

);

\copy stock_data_tmp FROM STDIN WITH CSV;

INSERT INTO stock_data
  SELECT code, to_date(date, 'YYYYMMDD'), open, high, low, close, volume 
  FROM stock_data_tmp;

DROP TABLE stock_data_tmp;
示例csv文件如下所示

AAA,20140102,21.195,21.24,1.16,1.215,607639
BBB,20140102,23.29,2.29,2.17,2.26,1863
CCC,20140102,61.34,0.345,0.34,0.34,112700
DDD,20140102,509.1,50.11,50.09,50.11,409863
从shell中,我尝试:

cat /path/to/20140102.txt | psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
但它给了我一个错误:

psql:/path/to/script/update_stock_data.sql:22: ERROR:  missing data for column "date"
CONTEXT:    COPY stock_data_tmp, line 1: ""
但是,如果在脚本中我将复制命令更改为:

\copy stock_data_tmp FROM '/path/to/20140102.txt' WITH csv;
。。。只要打个电话

psql -d my_db_name -f ~/path/to/script/update_stock_data.sql
它成功了


为什么在使用
cat
STDIN
时会出现此错误,而在使用文件路径时不会出现此错误?

因为如果使用
-f
COPY
将尝试从该文件而不是从STDIN读取