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



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

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 语句和未知值包含在其中,但我宁愿将脚本保留在尽可能少的部分。

您确定其余列具有正确的值吗? 我怀疑错误可能沿着这些思路。

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

最新更新