将数据库中一个 table 的值插入另一个数据库中的另一个 table
Insert values of one table in a database to another table in another database
我想从 DB1 的 table 中获取一些数据,并将其中一些数据插入到 DB2 中的 table。
如何才能做到这一点?
这是我目前得到的:
CREATE VIEW old_study AS
SELECT *
FROM dblink('dbname=mydb', 'select name,begins,ends from study')
AS t1(name varchar(50), register_start date, register_end date);
/*old_study now contains the data I wanna transfer*/
INSERT INTO studies VALUES (nextval('studiesSequence'),name, '',3, 0, register_start, register_end)
SELECT name, register_start, register_end from old_study;
这是我的 table 在 DB2 中的样子:
CREATE TABLE studies(
id int8 PRIMARY KEY NOT NULL,
name_string VARCHAR(255) NOT NULL,
description VARCHAR(255),
field int8 REFERENCES options_table(id) NOT NULL,
is_active INTEGER NOT NULL,
register_start DATE NOT NULL,
register_end DATE NOT NULL
);
循环和光标是不得已的武器。尽量避开它们。你可能想要 INSERT INTO ... SELECT
:
INSERT INTO x(x, y, z)
SELECT x, y, z
FROM t;
编辑:
INSERT INTO vip_employees(name, age, occupation) -- your column list may vary
SELECT name, age, occupation
FROM employees;
INSERT INTO studies
(
id
,name_string
,description
,field
,is_active
,register_start
,register_end
)
SELECT nextval('studiesSequence')
,NAME
,''
,3
,0
,register_start
,register_end
FROM dblink('dbname=mydb', 'select name,begins,ends from study')
AS t1(NAME VARCHAR(50), register_start DATE, register_end DATE);
您可以直接插入由dblink()
返回的值(这意味着不需要创建视图)
您应该在 insert
和 select
中包含列名:
insert into vip_employees(name, age, occupation)
select name, age, occupation
from employees;
但是,您的数据结构值得怀疑。要么你应该在 employees
中使用一个标志来标识 "VIP employees"。 或你应该在employees
中有一个主键,并在vip_employees
中使用这个主键来引用employees
。复制数据字段很少是正确的做法,尤其是对于像年龄这样会随时间变化的列。说到这一点,您通常会根据出生日期得出年龄,而不是直接将其存储在 table.
中
你的语法有误。在 INSERT 语句中不能有 both,常量值 的值子句和 查询的 select 子句。
您必须 select 查询中的常量值:
insert into studies
(
id,
name_string,
description,
field,
is_active,
register_start,
register_end
)
select
studiesSequence.nextval,
name,
'Test',
null,
0,
register_start,
register_end
from old_study;
我想从 DB1 的 table 中获取一些数据,并将其中一些数据插入到 DB2 中的 table。
如何才能做到这一点?
这是我目前得到的:
CREATE VIEW old_study AS
SELECT *
FROM dblink('dbname=mydb', 'select name,begins,ends from study')
AS t1(name varchar(50), register_start date, register_end date);
/*old_study now contains the data I wanna transfer*/
INSERT INTO studies VALUES (nextval('studiesSequence'),name, '',3, 0, register_start, register_end)
SELECT name, register_start, register_end from old_study;
这是我的 table 在 DB2 中的样子:
CREATE TABLE studies(
id int8 PRIMARY KEY NOT NULL,
name_string VARCHAR(255) NOT NULL,
description VARCHAR(255),
field int8 REFERENCES options_table(id) NOT NULL,
is_active INTEGER NOT NULL,
register_start DATE NOT NULL,
register_end DATE NOT NULL
);
循环和光标是不得已的武器。尽量避开它们。你可能想要 INSERT INTO ... SELECT
:
INSERT INTO x(x, y, z)
SELECT x, y, z
FROM t;
编辑:
INSERT INTO vip_employees(name, age, occupation) -- your column list may vary
SELECT name, age, occupation
FROM employees;
INSERT INTO studies
(
id
,name_string
,description
,field
,is_active
,register_start
,register_end
)
SELECT nextval('studiesSequence')
,NAME
,''
,3
,0
,register_start
,register_end
FROM dblink('dbname=mydb', 'select name,begins,ends from study')
AS t1(NAME VARCHAR(50), register_start DATE, register_end DATE);
您可以直接插入由dblink()
返回的值(这意味着不需要创建视图)
您应该在 insert
和 select
中包含列名:
insert into vip_employees(name, age, occupation)
select name, age, occupation
from employees;
但是,您的数据结构值得怀疑。要么你应该在 employees
中使用一个标志来标识 "VIP employees"。 或你应该在employees
中有一个主键,并在vip_employees
中使用这个主键来引用employees
。复制数据字段很少是正确的做法,尤其是对于像年龄这样会随时间变化的列。说到这一点,您通常会根据出生日期得出年龄,而不是直接将其存储在 table.
你的语法有误。在 INSERT 语句中不能有 both,常量值 的值子句和 查询的 select 子句。
您必须 select 查询中的常量值:
insert into studies
(
id,
name_string,
description,
field,
is_active,
register_start,
register_end
)
select
studiesSequence.nextval,
name,
'Test',
null,
0,
register_start,
register_end
from old_study;