RedShift - 在某些情况下插入初始单个值时不考虑身份种子值

RedShift - Identity seed value not respected in some circumstances when inserting initial single value

我的 table 之一中有一个身份字段,指定为

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

种子设置为 -1 以解释一个未知值(在我的所有 table 中通用)并且有问题的 table 被附加到而不是每次都被删除和重新创建,但如果 table 被意外删除,则该过程会重新创建。

由于 RedShift 不支持 if 语句(理想情况下,如果 table 不存在,我只会插入未知值),我的解决方法(使用 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 字段将完全按预期工作而不会失败。测试此过程涉及在每次迭代中删除和重新创建此 table。

我已经完成了流程的常规扫描 documentation/forums/etc,但在别处看不到这方面的报道。这是一个可以通过指定附加参数来解决的已知问题吗?我有一个解决方法(在我的应用程序中的其余过程之前包含创建语句和未知值,但我宁愿将脚本分成尽可能少的部分。

您确定其余列的值正确吗?我怀疑错误可能与这些有关。

您可以使用 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)