Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 亚马逊红移键未强制执行-如何防止重复数据?_Sql_Amazon Web Services_Amazon Redshift - Fatal编程技术网

Sql 亚马逊红移键未强制执行-如何防止重复数据?

Sql 亚马逊红移键未强制执行-如何防止重复数据?,sql,amazon-web-services,amazon-redshift,Sql,Amazon Web Services,Amazon Redshift,只需测试AWS Redshift,并在插入中发现一些重复数据,我希望这些重复数据在“键”列中的复制失败,阅读文档就会发现主键约束不是“强制的” 任何人都知道如何防止主键上的重复(按照“传统”的预期) 感谢所有红移先锋 是的,你不能那样做。目前,我认为您应该只插入带有额外时间戳列的重复数据(基本上是重复的键)。因此,它将具有该特定行的所有版本,因为update也是一个insert,当您查询Redshift时,请确保选择最新版本。一种快速而肮脏的方法是使用group by select max(&l

只需测试AWS Redshift,并在插入中发现一些重复数据,我希望这些重复数据在“键”列中的复制失败,阅读文档就会发现主键约束不是“强制的”

任何人都知道如何防止主键上的重复(按照“传统”的预期)


感谢所有红移先锋

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

一种快速而肮脏的方法是使用group by

select max(<column_a>), max(<column_a>), <pk_column1>, <pk_column2>
from <table_name>
group by <pk_column1>, <pk_column2>
选择max(),max(),
从…起
分组:,

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

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


我在创建记录时分配UUID。如果记录本身是唯一的,我使用类型4 UUID(随机),如果不是,我使用类型5(SHA-1散列),使用自然键作为输入。
然后,您可以很容易地按照AWS进行升级。如果您的输入有重复项,您应该能够通过在暂存表中发出类似以下内容的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

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

  • 将所有重复数据行提取到临时表中(使用
    DISTINCT
    清除重复数据)
  • 从主表中删除这些行
  • 将行重新插入主表
下面是一个示例:(假设
id
是检查复制的关键,而
data\u table
是您的表)


经确认,他们不会强制执行:

唯一性、主键和外键约束是信息性的 只有亚马逊红移并没有强制执行。尽管如此,主要 键和外键用作计划提示,它们应该 声明应用程序中的ETL进程或其他进程 强化他们的诚信

例如,查询计划器在中使用主键和外键 某些统计计算,以推断唯一性和参考性 影响子查询解相关技术的关系 大量联接,并消除冗余联接

规划者利用这些关键关系,但它假设所有 Amazon红移表中的键在加载时有效。如果你的 应用程序允许无效的外键或主键,某些查询 可能返回不正确的结果。例如,SELECT DISTINCT查询 如果主键不唯一,则可能返回重复的行。不要 如果怀疑表的有效性,请为表定义键约束。在…上 另一方面,您应该始终声明主键和外键以及 当您知道唯一性约束是有效的时

Amazon Redshift不强制非空列约束


我认为,无论您使用什么代码进行发布,都需要首先运行一个查询,以验证具有该键的记录是否已经存在。我希望避免这种情况。一个容易考虑的环境是一个时间维度的时间维度。我希望只插入可能在维度查询中使用的行,但是如果我必须选择然后插入数据跨越的每一个可能的小时,而这些小时正被数百万行使用,那就太疯狂了。事实表有一个时间键,yyyy_mm_dd_hh-这个键链接到维度表,该维度表扩展数据(年、月、日、星期、星期、业务季度等)。当然,希望有一个替代方案……甚至,你找到解决方案了吗?我求助于在diff连接上使用MySQL表作为中介,在将数据添加到维度表(这是一个问题)之前,使用它权衡一组因素。从清洁度的角度来看,这不是最优的,但是,考虑到影响决策的业务因素,我别无选择。该死,我希望听到你提出一个纯粹的AWS解决方案。我可能最后也不得不做那样的事(由于数据集数量巨大,在输入数据的过程中欺骗数据不是一个选择——问题是在输入数据的过程中保持数据的清洁。谢谢……欣赏整个方孔圆钉。这可能是一种恢复显著性以优化查询速度的有趣方法。感谢分享Enno。我从未想过添加我不知道这会在非常大的数据步骤上产生什么样的节约。很容易实现自动化。嗨@Saeven!你在生产中使用过这种方法吗?你能分享你的反馈吗?或者你找到了更好的替代方法吗?谢谢。这并没有回答这个问题。这似乎应该有效(因此,我猜测,除了Redshift之外,没有尝试过它或在数据库中使用过它的人会投更多的票),但不幸的是,这不是因为语句中的DISTINCT从l.id=d.id;上的data_table d JOIN delete_dupe_row_list l中选择DISTINCT d.*,不会被红移-结果包含原始表中的所有重复项,这意味着它们都会进入delete_dupe_rows表并在以后重新插入。
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;