amazon-redshift - 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'
我的表很大,我想在另一个表连接的表开头添加几列。因此使用这种方法。我没有在问题中添加的连接查询,因为它不相关。
解决方案
我认为您遇到了“选择进入”的许多限制中的第一个,您将想要调查这是否真的是您想要在此用例中走的那条路线。让我试着列出我看到的一些担忧。
首先,就您所发现的设置目标表属性而言,“选择进入”并不是很丰富。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,您将需要确保没有重复项。
推荐阅读
- selenium - Java Selenium'无法解析符号测试'TestNG
- google-apps-script - 谷歌电子表格的基于时间的触发器
- flutter - 使用 iOS 模拟器测试 plaid_flutter 时没有弹出键盘
- amazon-web-services - Codebuild 中的 Codepipeline S3 存储桶访问被拒绝
- sql - 根据开始/结束选择指定日期之前和之后的连续日期计数
- django - Django没有完全按照表格中输入的方式存储数据
- visual-studio - 如何克服“运行应用程序前请选择有效设备”。在 Windows 10 上与 Mac Visual Studio 配对
- django - 如何在 Django 中获取动态 HTML 表单字段的名称和值?
- python - 如何为来自 uNet 的预测图像设置阈值
- android - 无法找到包含 Intent 在片段中时的配置根