Ваша проблема заключается в том, что вам нужно иметь те же значения для исходных столбцов IDENTITY в вашей копии в Vertica, при этом имея возможность AUTOINCREMENT для любых новых строк, которые вы теперь можете вставить в новую таблицу.
Это может быть достигнуто с помощью целевого суррогатного ключа Vertica не как IDENTITY, а как INT NOT NULL, но с присвоением ему значения DEFAULT из nextval
метода вручную созданной последовательности.
У вас естьэта таблица и эти данные (могут быть из любой исходной базы данных ...), в которых есть столбец IDENTITY.
-- source (could be from anywhere - why not on my own Vertica sandbox)
CREATE TABLE src (
src_id IDENTITY NOT NULL
, first_name VARCHAR(32)
, last_name VARCHAR(32)
, hire_dt DATE
) UNSEGMENTED ALL NODES
;
INSERT /*+ DIRECT */ INTO src(first_name,last_name,hire_dt)
SELECT 'Ford','Prefect',DATE '2017-02-05'
UNION ALL SELECT 'Svlad','Cjelli',DATE '2017-02-05'
UNION ALL SELECT 'Cynthia','Fitzmelton',DATE '2017-02-05'
UNION ALL SELECT 'Stavro','Mueller',DATE '2017-02-05'
UNION ALL SELECT 'Veet','Voojagig',DATE '2017-02-05'
UNION ALL SELECT 'Trin','Tragula',DATE '2017-02-05'
UNION ALL SELECT 'Zarniwoop','Zarniwoop',DATE '2017-02-05'
UNION ALL SELECT 'Rob','McKenna',DATE '2017-02-05'
UNION ALL SELECT 'The Lajestic Vantrashell','of Lob',DATE '2017-02-05'
UNION ALL SELECT 'Paul Neil Milne','Johnston',DATE '2017-02-05'
UNION ALL SELECT 'Lunkwill','Lunkwill',DATE '2017-02-05'
UNION ALL SELECT 'Arthur','Dent',DATE '2017-02-05'
UNION ALL SELECT 'Zaphod','Beeblebrox',DATE '2017-02-05'
UNION ALL SELECT 'Tricia','McMillan',DATE '2017-02-05'
UNION ALL SELECT 'Prostetnic Vogon','Jeltz',DATE '2017-02-05'
UNION ALL SELECT 'Lionel','Prosser',DATE '2017-02-05'
UNION ALL SELECT 'Karl','Mueller',DATE '2017-02-05'
UNION ALL SELECT 'Hotblack','Desiato',DATE '2017-02-05'
UNION ALL SELECT 'Gogrilla','Mincefriend',DATE '2017-02-05'
UNION ALL SELECT 'Slartibartfast','Slartibartfast',DATE '2017-02-05'
UNION ALL SELECT 'Roosta','Roosta',DATE '2017-02-05'
UNION ALL SELECT 'Eccentrica','Gallumbitis',DATE '2017-02-05'
UNION ALL SELECT 'Pizpot','Gargravarr',DATE '2017-02-05'
UNION ALL SELECT 'Vroomfondel','Vroomfondel',DATE '2017-02-05'
UNION ALL SELECT 'Majikthise','Majikthise',DATE '2017-02-05'
UNION ALL SELECT 'Gengis Temüjin','Khan',DATE '2017-02-05'
UNION ALL SELECT 'Know-Nothing-Bozo','the Non-Wonder Dog',DATE '2017-02-05'
UNION ALL SELECT 'Lazlaar','Lyricon',DATE '2017-02-05'
UNION ALL SELECT 'Lintilla','Lintilla',DATE '2017-02-05'
UNION ALL SELECT 'Fook','Fook',DATE '2017-02-05'
UNION ALL SELECT 'Gag','Halfrunt',DATE '2017-02-05'
UNION ALL SELECT 'Benji','Mouse',DATE '2017-02-05'
UNION ALL SELECT 'Frankie','Mouse',DATE '2017-02-05'
UNION ALL SELECT 'Grunthos','the Flatulent',DATE '2017-02-05'
UNION ALL SELECT 'Wowbagger','The Infinitely Prolonged',DATE '2017-02-05'
UNION ALL SELECT 'Wonko','The Sane',DATE '2017-02-05'
UNION ALL SELECT 'Reg','Nullify',DATE '2017-02-05'
UNION ALL SELECT 'Fenchurch','of Rickmansworth',DATE '2017-02-05'
UNION ALL SELECT 'Oolon','Colluphid',DATE '2017-02-05'
UNION ALL SELECT 'Humma','Kavula',DATE '2017-02-05'
UNION ALL SELECT 'Judiciary','Pag',DATE '2017-02-05'
UNION ALL SELECT 'Max','Quordlepleen',DATE '2017-02-05'
;
Из этой исходной таблицы вы определяете самое высокое на данный момент выданное значение IDENTITY:
SQL>select max(src_id) from src;
max
42
В целевой базе данных Vertica это значение используется для создания совершенно новой последовательности вручную ...
CREATE SEQUENCE seq_copy MINVALUE 43;
Вы создаете целевую таблицу с суррогатным идентификатором в зависимости от того или иного вводазначение (которое вы будете указывать в INSERT ... SELECT или в команде COPY) или из только что созданной последовательности nextval
:
CREATE TABLE cpy (
cpy_id INT NOT NULL DEFAULT(seq_copy.nextval)
, first_name VARCHAR(32)
, last_name VARCHAR(32)
, hire_dt DATE
) UNSEGMENTED ALL NODES
;
Тогда, если вы укажете все столбцы (или ни одного вообще)
В INSERT ...
INSERT INTO cpy (
cpy_id
, first_name
, last_name
, hire_dt
)
SELECT * FROM src;
.. или COPY ...
COPY cpy (cpy_id,first_name,last_name,hire_dt)
FROM LOCAL 'src.csv' DELIMITER ',' ENCLOSED BY '''' ;
... вы используете значения из источника.
И если вы вставите новое значение, вы не коснетесь суррогатной клавиши ...
INSERT INTO cpy (
first_name
, last_name
, hire_dt
) VALUES (
'Thor'
, 'son of Odin'
, '2000-01-01'
;
.... и суррогатный ключ будет заполнен для вас.
Это то, что вы ищете?
Марко