pgAdmin / psql如何将新列的数据导入现有记录?

时间:2018-07-18 03:11:31

标签: sql psql pgadmin

我在包含用户记录的postgresql数据库中有几个表。我想在用户表中添加一个新列,想知道如何导入该新列的数据。

我有一个CSV文件,但是在不覆盖任何现有记录的情况下,无法找到导入数据的最佳方法。

谢谢。

1 个答案:

答案 0 :(得分:1)

我认为仅凭一个psql命令就不可能实现您的请求,但是我认为您可以通过几个步骤就可以实现目标。

  1. 在数据库中创建与CSV结构匹配的临时表(我假设CSV包含2列,主键和新列数据)
  2. 使用postgres的COPY命令(文档:https://www.postgresql.org/docs/current/static/sql-copy.html)用CSV数据填充此临时表
  3. 运行UPDATE查询以将数据从临时表复制到现有表中
  4. 删除临时表,您就完成了!

sqlfiddle示例:http://sqlfiddle.com/#!17/fa5585/1

DDL

-- existing table in your db
create table my_table (
  id integer PRIMARY KEY,
  some_col integer
);

-- some dummy data
insert into my_table (id, some_col)
values (1, 111), (2, 222), (3, 333);

-- create temp_table with same structure as CSV
create table temp_table (
  id integer PRIMARY KEY,
  new_col_val text
);

-- some dummy data, but you can use postgresql's COPY command to copy data from a CSV
-- docs: https://www.postgresql.org/docs/current/static/sql-copy.html
insert into temp_table (id, new_col_val)
values (1, 'hello'), (2, 'hi'), (3, 'hey');

查询

-- view initial contents of my_table
select * from my_table;

-- view initial contents of temp_table
select * from temp_table;

-- add new column to my_table
alter table my_table add column new_col text;

-- populate new column with data from temp_table
update my_table set new_col = new_col_val
from temp_table
where my_table.id = temp_table.id;

-- view results
select * from my_table;