未实施Amazon Redshift密钥 - 如何防止重复数据?

Sae*_*ven 18 sql amazon-web-services amazon-redshift

刚刚测试了AWS Redshift,并且在插件上发现了一些我希望在关键列中重复失败的重复数据,阅读文档显示主键约束没有"强制执行".

任何人都想出如何防止主键上的重复(按照"传统"期望).

感谢任何Redshift先驱!

Enn*_*oji 8

我在创建记录时分配UUID.如果记录本质上是唯一的,我使用类型4 UUID(随机),当它们不是时,我使用自然键作为输入使用类型5(SHA-1哈希).
然后,您可以非常轻松地按照AWS的说明执行UPSERT.如果您的输入有重复项,则应该能够通过在登台表中发出类似于此的SQL来进行清理:

CREATE TABLE cleaned AS
SELECT
  pk_field,
  field_1,
  field_2,
  ...  
FROM (
       SELECT
         ROW_NUMBER() OVER (PARTITION BY pk_field order by pk_field) AS r,
       t.*
       from table1 t
     ) x
where x.r = 1
Run Code Online (Sandbox Code Playgroud)


Kem*_*mal 6

如果添加标识列以用作rowid为时已晚(ALTER不允许您IDENTITY在Redshift中添加列),则可以执行以下操作:

  • 将所有欺骗行提取到临时表(用于DISTINCT摆脱欺骗)
  • 从主表中删除这些行
  • 将行重新插入主表

这是一个例子:(让我们假设id你是检查欺骗的关键,并且data_table是你的表)

CREATE TEMP TABLE delete_dupe_row_list AS
    SELECT t.id FROM data_table t WHERE t.id IS NOT NULL GROUP BY t.id HAVING COUNT(t.id)>1;
CREATE TEMP TABLE delete_dupe_rows AS
    SELECT DISTINCT d.* FROM data_table d JOIN delete_dupe_row_list l ON l.id=d.id;
START TRANSACTION;
DELETE FROM data_table USING delete_dupe_row_list l WHERE l.id=data_table.id;
INSERT INTO data_table SELECT * FROM delete_dupe_rows;
COMMIT;
DROP TABLE delete_dupe_rows;
DROP TABLE delete_dupe_row_list;
Run Code Online (Sandbox Code Playgroud)


GG.*_*GG. 1

是的,你不能那样做。目前,我认为您应该只插入重复的数据(基本上是重复的键)和额外的时间戳列。因此它将包含该特定行的所有版本,因为更新也是插入,并且在您查询 Redshift 时,请确保选择最新的版本。