我想从DB1的表中获取一些数据,并将一些数据插入DB2中的表。
如何进行此操作?
这是我到目前为止所得到的:
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;
这是我在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
);
答案 0 :(得分:3)
您应该在insert
和select
:
insert into vip_employees(name, age, occupation)
select name, age, occupation
from employees;
但是,您的数据结构是可疑的。您应该使用employees
中的标记来识别" VIP员工"。 或您应该在employees
中拥有主键,并在vip_employees
中使用此主键来引用employees
。复制数据字段很少是正确的事情,特别是对于年龄会随时间变化的列。说到这一点,你通常从出生日期算出年龄,而不是直接存放在表格中。
答案 1 :(得分:1)
循环和光标是万不得已的武器。尽量避免它们。您可能需要INSERT INTO ... SELECT
:
INSERT INTO x(x, y, z)
SELECT x, y, z
FROM t;
的 SqlFiddleDemo
强>
修改强>
INSERT INTO vip_employees(name, age, occupation) -- your column list may vary
SELECT name, age, occupation
FROM employees;
答案 2 :(得分:1)
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()
(表示不需要创建视图)的值。
答案 3 :(得分:0)
你的语法错了。对于INSERT语句中的查询,不能为两者创建常量值的值子句和。
您必须在查询中选择常量值:
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;