Amazon redshift 使用非空约束红移选择到

Amazon redshift 使用非空约束红移选择到,amazon-redshift,Amazon Redshift,我正在使用红移中的SELECT INTO从dos创建一个新表dos3。但是,虽然位置代码是表dos中的主键(非空),但在执行SELECT INTO操作后,新表将其转换为可空字段 也不支持Alter Column SET NOT NULL。如何做到这一点 SELECT location_code, item_no INTO analytics.dos3 FROM analytics.dos WHERE date>'2020-10-20' 我的表dos很大,我想从另一个表联接在表的开头添

我正在使用红移中的SELECT INTO从dos创建一个新表dos3。但是,虽然位置代码是表dos中的主键(非空),但在执行SELECT INTO操作后,新表将其转换为可空字段

也不支持Alter Column SET NOT NULL。如何做到这一点

SELECT
 location_code, item_no
INTO analytics.dos3 
FROM analytics.dos
WHERE date>'2020-10-20'

我的表dos很大,我想从另一个表联接在表的开头添加几列。因此使用这种方法。我没有在问题中添加连接查询,因为它不相关。

我认为您遇到了“选择进入”的许多限制中的第一个限制,您需要调查这是否真的是您希望在本用例中采用的路线。让我试着阐述一下我所看到的一些担忧

首先,“selectinto”在设置目标表属性方面不是很丰富。CTAS(CreateTableAs)具有更多功能,例如设置表分布和排序键,这就是为什么它通常比“选择进入”更受欢迎的原因。您说结果表将被添加到并变得非常大-在表上有键将是一个好主意。当移动的数据量较大时,CTAS的性能也较高。但即使是CTA也无法提供所需的每列定义(以及此表展开时可能需要的其他定义)

其他一些注意事项-由于在创建此表后要添加大量数据,因此需要确保这些大量数据适合列定义。瓦查尔家族足够大吗?数字大小合适吗?等。您需要在表上设置键-dist、sort、primary等-以获得最佳性能。列编码也有帮助。对于大型表,确保varchar列不是最大大小(64k)也是很重要的—虽然具有大型varchar不会影响磁盘存储,但它们会影响查询期间的内存利用率。当这个表变得非常大时,这可能是性能杀手

总而言之,非常大的表需要更多地考虑“只需从选择到创建它”。您需要创建最佳表定义,然后将数据插入其中。(我现在要离开我的肥皂盒)

如果您仍然想沿着这条路径前进,可以在事实之后设置这个列属性(排序)。它只需要4个步骤。1) 使用“ALTERTABLE”添加具有所需属性的另一列。2) 使用“选择到”中的数据更新此新列。3) 从表中删除原始列。4) 使用“ALTERTABLE”将新列重命名为与原始列相同的列。可以对任意数量的列执行此操作。当然,对我来说,首先做一张合适的桌子似乎更容易


请记住,红移不会强制主键的唯一性-这是用户的责任。由于您正在对新表进行多次插入,因此如果这确实是一个PK,您需要确保没有重复项。

这是正确的,select into不会将not null带到新表中。使用列列表、数据类型和分发键等显式创建表。。。然后运行插入到..选择列表。然后在末尾重命名表,这是最快的方法


添加附加列、更新列和删除旧列是一个非常耗费资源的过程,可能会运行很长时间,具体取决于表中的数据量。

你说得绝对正确!在花了半天时间试图实现这一点后,我才意识到红移的局限性。最后,在尝试将INSERT插入SELECT etc(保留nullable)之后,我意识到这一切都不是可伸缩的,于是我选择了S3复制路径