Добавьте AUTO INCREMENT или IDENTITY к существующей таблице в Vertica - PullRequest
0 голосов
/ 11 июня 2018

У меня есть существующая база данных postgresql с автоматически увеличивающимся столбцом, которую я хочу перенести в Vertica.В Vertica я могу создать таблицу с ограничениями IDENTITY или AUTO INCREMENT (или типом данных?), Но не могу добавить эти ограничения в столбец с существующими данными на нем.Ответ на похожий вопрос здесь - это обходной путь с использованием последовательности, которая не является опцией, поскольку допускаются дублирующие числа и может существовать условие гонки между несколькими узлами, которое обеспечивается реализацией IDENTITY,Создание таблицы со столбцом IDENTITY также не допускается, поскольку вставка запрещена.

Короче говоря, я хочу иметь столбец IDENTITY для существующих данных, который в то же время является первичным ключом.

1 Ответ

0 голосов
/ 13 июня 2018

Ваша проблема заключается в том, что вам нужно иметь те же значения для исходных столбцов 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'
;

.... и суррогатный ключ будет заполнен для вас.

Это то, что вы ищете?

Марко

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...