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

时间:2013-03-02 04:26:17

标签: sql amazon-web-services amazon-redshift

只是测试 AWS Redshift ,并且在插件上发现了一些我希望在关键列中重复失败的重复数据,阅读文档显示主键约束不是' t“强制执行”。

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

感谢任何Redshift先驱!

6 个答案:

答案 0 :(得分:8)

我在创建记录时分配UUID。如果记录本质上是唯一的,我使用类型4 UUID(随机),当它们不是时,我使用自然键作为输入使用类型5(SHA-1哈希)。
然后,您可以非常轻松地通过AWS关注this instruction来执行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

答案 1 :(得分:6)

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

  • 将所有欺骗行提取到临时表(使用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;

答案 2 :(得分:1)

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

答案 3 :(得分:1)

快速而肮脏的方法是使用分组

select max(<column_a>), max(<column_a>), <pk_column1>, <pk_column2>
from <table_name>
group by <pk_column1>, <pk_column2>

答案 4 :(得分:1)

确认,他们没有强制执行:

  

唯一性,主键和外键约束是信息性的   只要;它们不是由Amazon Redshift强制执行的。尽管如此,小学   密钥和外键用作计划提示,它们应该是   如果您的ETL过程或您的应用程序中的其他过程声明   强化他们的诚信。

     

例如,查询规划器使用主键和外键   某些统计计算,以推断唯一性和参考   影响子查询去相关技术的关系,以便订购   大量的连接,并消除冗余连接。

     

规划师利用这些关键关系,但它假设所有   Amazon Redshift表中的密钥在加载时有效。如果你的   应用程序允许无效的外键或主键,一些查询   可能会返回错误的结果例如,SELECT DISTINCT查询   如果主键不唯一,则可能会返回重复的行。不要   如果您怀疑其有效性,请为您的表定义关键约束。上   另一方面,你应该总是声明主键和外键   当你知道它们是有效的时,就会有唯一性限制。

     

Amazon Redshift会强制执行NOT NULL列约束。

http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html

答案 5 :(得分:-1)

我正在使用IDENTITY自动递增主键。

以下是我在AWS论坛上提出的问题:

https://forums.aws.amazon.com/message.jspa?messageID=450157#450157