如何在 AWS REDSHIFT 中使现有列不为空?

Posted

技术标签:

【中文标题】如何在 AWS REDSHIFT 中使现有列不为空?【英文标题】:How to make an existing column NOT NULL in AWS REDSHIFT? 【发布时间】:2021-06-04 12:23:04 【问题描述】:

我已经通过粘合作业动态创建了一个表格,并且它成功地工作正常。但根据新要求,我需要添加一个新列,该列生成唯一值并且应该是 redshift 中的主键。

我已经使用 rownum() 函数实现了相同的功能,并且运行良好。但最新的要求是特定列应该是主键。

当我尝试这样做时,它会要求该列不为空。你知道如何通过粘合作业使列不为空吗?或任何使其不为空的红移查询。 我尝试了所有方法都没有运气。

w = Window().orderBy(lit('A'))
df = timestampedDf.withColumn("row_num", row_number().over(w))
rowNumDf = DynamicFrame.fromDF(df1, glueContext, "df1")

postStep = "begin; ALTER TABLE TAB_CUSTOMER_DATA ALTER COLUMN row_num INTEGER NOT NULL; ALTER TABLE TAB_CUSTOMER_DATA ADD CONSTRAINT PK_1 PRIMARY KEY (row_num); end;"

## @type: DataSink
## @args: [catalog_connection = "REDSHIFT_CONNECTION", connection_options = "dbtable": "tab_customer_data", "database": "randomdb", redshift_tmp_dir = TempDir, transformation_ctx = "datasink4"]
## @return: datasink4
## @inputs: [frame = rowNumDf]
datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = rowNumDf, catalog_connection = "REDSHIFT_CONNECTION", connection_options = "dbtable": "TAB_CUSTOMER_DATA", "database": "randomdb", "postactions": postStep, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink4")
job.commit()

【问题讨论】:

你可以试试这个方法的修改版ubiq.co/database-blog/…。 您是否考虑过拥有一个身份列?这些被设计为唯一的,而主键不能保证是唯一的(由用户来确保唯一性,因为它不是由 Redshift 强制执行的)。 非常感谢乔恩。它正在使用这种方法。 【参考方案1】:

我已经使用以下链接方法解决了这个问题:

    添加一个具有默认值且不为空的新列。 将旧列值更新为新列。 删除旧列。 将此新列设为主要列。

https://ubiq.co/database-blog/how-to-remove-not-null-constraint-in-redshift/

【讨论】:

以上是关于如何在 AWS REDSHIFT 中使现有列不为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何使视图列不为空

SQL:如何在 B 列不为空的情况下使用“100”更新 A 列

EXCEL如何通过函数得到一列不为空值的数

按列分组,优先选择另一列不为空的行

MySQL选择其中列不为空

如果特定列不为空,则 Google 表格导入范围