将数据库中一个 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;

SqlFiddleDemo

编辑:

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()返回的值(这意味着不需要创建视图

您应该在 insertselect 中包含列名:

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;