RedShift - значение начального значения не учитывается в некоторых случаях при вставке исходного единственного значения - PullRequest
0 голосов
/ 04 июня 2018

У меня есть поле идентификатора в одной из моих таблиц, заданное как

User_Key BIGINT PRIMARY KEY IDENTITY(-1,1) NOT NULL

Для начального числа задано -1, чтобы учесть неизвестное значение (универсальное для всех моих таблиц) и таблицу, о которой идет речьдобавляется, а не удаляется и воссоздается каждый раз, но процесс настроен на воссоздание таблицы, если она случайно отброшена.

Поскольку RedShift не поддерживает операторы if (в идеале, я бы вставил неизвестное значение, если таблица еще не существует), мой обходной путь (с использованием EXCEPT) показан ниже.

CREATE TABLE IF NOT EXISTS TBL
        (User_Key BIGINT PRIMARY KEY IDENTITY(-1,1) NOT NULL
        ,Col1 VARCHAR(255) NOT NULL
        ,Col2 INT
        ,COL3 VARCHAR(255) NOT NULL

INSERT INTO TBL
        (Col1
        ,Col2
        ,Col3)
SELECT
        'Unknown'
        NULL
        'Etc'
EXCEPT
SELECT
        Col1
        ,Col2
        ,Col3
FROM TBL

В предложении EXCEPT значение в поле User_Key изменяется (но никогда не равно -1, как ожидается).Без условия EXCEPT поле User_Key работает точно так же, как и ожидалось.Тестирование этого процесса включало удаление и воссоздание этой таблицы при каждой итерации.

Я выполнил обычную проверку документации процесса / форумов и т. Д., Но не вижу, чтобы об этом сообщали в другом месте.Это известная проблема, которую можно исправить, указав дополнительные параметры?У меня есть обходной путь для этого (включая инструкцию create и неизвестное значение до остальной части процедуры в моем приложении, но я бы предпочел сохранить сценарий как можно меньшим количеством частей.

1 Ответ

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

Вы уверены, что оставшиеся столбцы имеют правильные значения?Я подозреваю, что ошибка может быть в том же духе.

Вы можете сделать это, используя not exists:

INSERT INTO TBL (Col1, Col2, Col3)
    SELECT x.*
    FROM (SELECT 'Unknown' as col1, NULL as col2, 'Etc' as col3) x
    WHERE NOT EXISTS (SELECT 1 FROM tbl WHERE tbl.user_key = -1)
...