RedShift - 插入初始单个值时,在某些情况下不尊重标识种子值

Posted

技术标签:

【中文标题】RedShift - 插入初始单个值时,在某些情况下不尊重标识种子值【英文标题】:RedShift - Identity seed value not respected in some circumstances when inserting initial single value 【发布时间】:2018-06-04 09:31:55 【问题描述】:

我的一张表中有一个标识字段,指定为

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】:

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

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

【讨论】:

尽管 User_Key 与种子不匹配,但由于行被正确插入到空表中,因此值将是正确的。您的解决方法非常有效 - 谢谢。

以上是关于RedShift - 插入初始单个值时,在某些情况下不尊重标识种子值的主要内容,如果未能解决你的问题,请参考以下文章

Redshift - 将文本列插入数据库表的问题

Redshift ROUND 函数在某些情况下不舍入?

批量插入的 Redshift 查询队列使用情况

使用 Python 将数据插入 RedShift

指定列默认值

如何忽略错误但不跳过 redshift 复制命令中的行