pgAdmin/psql 如何将新列的数据导入现有记录?
pgAdmin/psql how to import new column's data to existing records?
我在包含用户记录的 PostgresQL 数据库中有几个 table。我想向用户 table 添加一个新列,并且想知道如何导入该新列的数据。
我有一个 CSV 文件,但无法找到在不覆盖任何现有记录的情况下导入数据的最佳方法。
提前致谢。
我认为您的请求无法通过单个 psql
命令实现,但我认为您可以通过几个步骤实现您的目标。
- 在您的数据库中创建临时 table 匹配 CSV 结构(我假设 CSV 包含 2 列,一个主键和新列数据)
- 使用 postgres 的
COPY
命令 用 CSV 数据填充这个临时 table
- 运行
UPDATE
查询将数据从临时 table 复制到现有的 table
DROP
临时 table 大功告成!
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;
我在包含用户记录的 PostgresQL 数据库中有几个 table。我想向用户 table 添加一个新列,并且想知道如何导入该新列的数据。
我有一个 CSV 文件,但无法找到在不覆盖任何现有记录的情况下导入数据的最佳方法。
提前致谢。
我认为您的请求无法通过单个 psql
命令实现,但我认为您可以通过几个步骤实现您的目标。
- 在您的数据库中创建临时 table 匹配 CSV 结构(我假设 CSV 包含 2 列,一个主键和新列数据)
- 使用 postgres 的
COPY
命令 用 CSV 数据填充这个临时 table
- 运行
UPDATE
查询将数据从临时 table 复制到现有的 table DROP
临时 table 大功告成!
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;