将数据库中一个表的值插入另一个数据库中的另一个表

时间:2015-10-21 11:17:12

标签: sql postgresql psql

我想从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
);

4 个答案:

答案 0 :(得分:3)

您应该在insertselect

中包含列名称
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;