首页 > 解决方案 > SELECT INTO WITH NOT NULL 约束 Redshift

问题描述

我正在使用 Redshift 中的 SELECT INTO 从 dos 创建一个新表 dos3。但是,虽然 location_code 是表 dos 中的主键(NOT NULL),但在执行 SELECT INTO 操作后,新表会将其转换为 NULLABLE 字段。

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

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

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

标签: amazon-redshift

解决方案


我认为您遇到了“选择进入”的许多限制中的第一个,您将想要调查这是否真的是您想要在此用例中走的那条路线。让我试着列出我看到的一些担忧。

首先,就您所发现的设置目标表属性而言,“选择进入”并不是很丰富。CTAS(create table as)具有更多功能,例如设置表分布和排序键,这就是为什么它通常比“select into”更受青睐。您说生成的表将被添加并变得非常大 - 在表上放置键将是一个好主意。当移动的数据量很大时,CTAS 的性能也更高。但即使 CTAS 也不会为您提供所需的每列定义(以及当此表扩展时您可能需要的其他定义)。

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

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

如果您仍然想走这条路,您可以在事后设置此列属性(有点)。它只需要一个 4 步骤的过程。1)使用“alter table”添加具有所需属性的另一列。2) 使用“select into”生成的数据更新这一新列。3) 从表中删除原始列。4) 使用“alter table”将新列重命名为与原始列相同。这可以对任意数量的列进行。对我来说,首先制作正确的桌子似乎更容易。

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


推荐阅读