如何在文件迭代期间保存psql中的记录

时间:2015-06-24 22:14:03

标签: excel postgresql csv ssh psql

我有一个只包含id的文件。 id匹配表中的一列。我想在该列中提取记录并在csv文件中获取结果。我不想创建另一张桌子。

我有docid.txt个文件,其中包含以下数据:

12000072
112073
11279
1182
11188
11182094
82099
11102

每个对应于学生表中的nameid列。学生表有:

name    nameid      dob         performance
-------------------------------------------
andre   12000072    12/4/1990   Excellent
Scott   112073      12/5/1999   Good
Reagan  2692882     15/7/2003   fair
Aldo    1402508     4/7/1998    Poor
Mary    2266257     5/11/1995   Very good
Walt    11182094    3/12/2000   Good
Tessy   82099       8/12/1999   Very good
Skinn   11102       7/2/2002    Excellent
Smart   678016      12/4/1990   fair
John    475689      12/5/1999   Poor
Rita    2796799    12/4/1990    Very good
Rachael 11188      12/5/1999    Poor
Gomez   3075168    3/12/2000    Very good
Becham  3075168    4/7/1998     Good
Walker  1050879    5/11/1995    Very good
Tommy   2017451    3/12/2000    Excellent
Trevor  11279      7/2/2002     Good
Litin   1182       12/5/1999    fair
Martha  883368     15/7/2003    fair
Rafael  3070833    4/7/1998     Poor
Kim     3070833    5/11/1995    Very good
Clichy  255918     12/4/1990    Good
Mario   2706915    12/5/1999    Excellent

我想从学生表中删除带有docid的学生。我尝试了以下方法:

for i in `cat docid.txt;` do
`psql -A -t $dbname $username << EOF`
`select * from student where nameid = $i;`
`EOF`
`done  >>docid.csv`

谢谢

1 个答案:

答案 0 :(得分:0)

假设您正在使用PostgreSQL,我建议copy将它们放入临时表中,然后加入它。

e.g。

$ psql <<'__END__'
BEGIN;
CREATE TEMPORARY TABLE docids (docid integer) ON COMMIT DROP;
\copy docids from 'docids.txt'
DELETE FROM student USING docids WHERE nameid = docid;
COMMIT;
__END__

除了比循环更简洁,更简单之外,它将更快,并且它将作为一个单元成功或失败,而不会在错误上留下半完成的工作。< / p>

如果要输出已删除的行,请将RETURNING *附加到DELETE语句,然后使用psql -q运行以禁止其他输出。