简体   繁体   中英

How does postgres db_link_build_sql_insert work?

I can't seem to figure out how this function is supposed to work for pushing data across from one table in your local database to another on a separate database. I have looked at the documentation and still don't understand the example given. I am working with a postgres 9.2 which makes it possible to use dblink.

Here is some example code where I am creating a test database and pushing values from my local table to the table on the test database. Can someone please fill in the missing part of the dblink_build_sql_insert function?

--drop database if exists testdb;
--create database testdb;

drop table if exists t;
create table t ( a integer, b text);
insert into t values (1,'10'), (2,'10'), (3,'30'), (4,'30');
create extension if not exists dblink;


select dblink_connect('dbname=testdb');
select dblink('drop table if exists t;');
select dblink('create table t ( a integer, b text);');
select dblink_build_sql_insert('t', ????);
select * from dblink('select * from t;') as (a integer, b text);

from docs :

Synopsis

 dblink_build_sql_insert(text relname, int2vector primary_key_attnums, integer num_primary_key_atts, text[] src_pk_att_vals_array, text[] tgt_pk_att_vals_array) returns text 

You don't have PK specified, so I assume it is on (a), which automatically means, that primary_key_attnums = 1 (PK on first column) and num_primary_key_atts=1 (one column PK). Two rest values made same to prepare statement ro "replicate" row with a=1 as is:

b=# select dblink_build_sql_insert('t',
     '1'::int2vector,
      1::int2,  -- num of pkey values
      '{1}'::text[], -- old pkey
     '{1}'::text[] -- new pkey
)
;
       dblink_build_sql_insert
-------------------------------------
 INSERT INTO t(a,b) VALUES('1','10')
(1 row)
b=# select dblink($$INSERT INTO t(a,b) VALUES('1','10')$$);
     dblink
----------------
 ("INSERT 0 1")
(1 row)

b=# select * from dblink('select * from t;') as (a integer, b text);
 a | b
---+----
 1 | 10
(1 row)

b=# select dblink_disconnect();
 dblink_disconnect
-------------------
 OK
(1 row)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM