Redshift psql: автоматическое приращение четного числа

Я пытаюсь создать таблицу с автоматически увеличивающимся столбцом, как показано ниже. Поскольку Redshift psql не поддерживает SERIAL, мне пришлось использовать тип данных IDENTITY < / а>:

IDENTITY (seed, step)
Предложение, указывающее, что столбец является столбцом IDENTITY. Столбец IDENTITY содержит уникальные автоматически сгенерированные значения. Эти значения начинаются со значения, указанного как начальное число, и увеличиваются на число, указанное как шаг. Тип данных для столбца IDENTITY должен быть INT или BIGINT.

Мой оператор создания таблицы выглядит так:

CREATE TABLE my_table(
        id INT IDENTITY(1,1),
        name CHARACTER VARYING(255) NOT NULL,
        PRIMARY KEY( id ) 
);

Однако, когда я пытался вставить данные в my_table, строки увеличивались только по четному числу, как показано ниже:

 id | name | 
----+------+
  2 | anna |
  4 | tom  |
  6 | adam |
  8 | bob  |
 10 | rob  |

Мои инструкции вставки выглядят следующим образом:

INSERT INTO my_table ( name ) 
VALUES ( 'anna' ), ('tom') , ('adam') , ('bob') , ('rob' );

У меня также возникли проблемы с возвратом столбца id в начало с 1. Существуют решения для типа данных SERIAL, но я не видел никакой документации для IDENTITY. Любые предложения будут высоко ценится!


person peipei    schedule 23.03.2015    source источник
comment
Странный. Я пробовал ваш код и не вижу проблемы. Идентификаторы 1-5.   -  person Anthony    schedule 26.03.2015
comment
У меня такая же проблема при загрузке файла csv из s3 в красное смещение.   -  person Alex Mathew    schedule 28.10.2015
comment
Для справки, у меня такая же проблема. Странно, как это непоследовательно. (Я сделал IDENTITY (0,1), как сказал Хорхе ниже, но второе значение 1 должно быть все, что имеет значение. Интересно, это региональная ошибка? Я на нас-запад-2 (Орегон)   -  person Cognitio    schedule 25.06.2016
comment
У меня такая же проблема: CREATE TABLE temp ( id bigint IDENTITY(0,1), val varchar(255) ); INSERT INTO temp (val) values ('a'), ('b'), ('c'); дает мне восходящие четные значения, начиная с 0.   -  person Ogaday    schedule 20.06.2017


Ответы (3)


Вы должны установить свою личность следующим образом:

id INT IDENTITY(0,1)

Источник: http://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_examples.html

И вы не можете сбросить идентификатор до 0. Вам придется отбросить таблицу и создать ее снова.

person Jorge    schedule 04.03.2016

Установите значение seed на 1 и значение step на 1.

Создать таблицу

CREATE table my_table(
    id bigint identity(1, 1),
    name varchar(100),
    primary key(id));

Вставить строки

INSERT INTO organization ( name ) 
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');

Результаты

 id | name | 
----+------+
  1 | anna |
  2 | tom  |
  3 | adam |
  4 | bob  |
  5 | rob  |

По какой-то причине, если вы установите значение seed на 0 и значение step на 1, тогда целое число будет увеличиваться с шагом 2.

Создать таблицу

CREATE table my_table(
    id bigint identity(0, 1),
    name varchar(100),
    primary key(id));

Вставить строки

INSERT INTO organization ( name ) 
VALUES ('anna'), ('tom') , ('adam'), ('bob'), ('rob');

Результаты

 id | name | 
----+------+
  0 | anna |
  2 | tom  |
  4 | adam |
  6 | bob  |
  8 | rob  |
person Andrew Fogg    schedule 22.11.2017

Этот вопрос подробно обсуждается на форуме AWS.

https://forums.aws.amazon.com/message.jspa?messageID=623201

Ответ от AWS.

Краткий ответ на ваш вопрос: seed и step будут учитываться только в том случае, если вы отключите параллелизм и параметр COMPUPDATE в своем COPY. Параллелизм отключен тогда и только тогда, когда вы загружаете данные из одного файла, что мы обычно не рекомендуем, и, следовательно, это маловероятный сценарий для большинства пользователей.

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

Причина, по которой COMPUPDATE влияет на вещи, заключается в том, что когда он включен, COPY фактически выполняет 2 прохода по вашим данным. Во время первого прохода он внутренне увеличивает значения идентификаторов, и в результате ваше начальное значение начинается с большего значения, чем вы ожидали.

Мы обновим документ, чтобы отразить это.

Также несколько узлов, похоже, вызывают такой эффект со столбцом IDENTITY. По сути, он может предоставить вам только гарантированные уникальные идентификаторы.

person Community    schedule 11.05.2018