不仅是测试AWS红移 ,并且已经发现了,我会希望在重复只会失败键列插入一些欺骗数据,读取文档揭示了主键约束不会“强迫”。
任何人都想出了如何防止在主键(每“传统”的期望)重复。
由于任何红移先驱!
不仅是测试AWS红移 ,并且已经发现了,我会希望在重复只会失败键列插入一些欺骗数据,读取文档揭示了主键约束不会“强迫”。
任何人都想出了如何防止在主键(每“传统”的期望)重复。
由于任何红移先驱!
我给你的UUID在创建记录时。 如果记录是固有的独特的,我使用类型4的UUID(随机),而当它们不是本人使用通过自然键作为输入类型5(SHA-1散列)。
然后,你可以按照这个指令通过AWS很容易进行UPSERTs。 如果输入有重复的,你应该能够通过发出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_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;
是啊你不能做到这一点。 从目前来看,我觉得你应该只插入重复数据(基本上是重复键)时间戳的一个额外的列。 因此,这将有一个特定行的所有版本,因为更新也镶入,而你查询红移,确保你选择最新的一个。
一个快速和肮脏的方法是通过使用组
select max(<column_a>), max(<column_a>), <pk_column1>, <pk_column2>
from <table_name>
group by <pk_column1>, <pk_column2>
经证实,他们不执行它:
唯一性,主键和外键约束仅供参考; 它们不是由亚马逊红移执行。 尽管如此,主键和外键被用来作为规划的提示,如果你的ETL过程中或在您的应用程序其他进程强制执行的完整性,他们应被宣布。
例如,查询规划使用某些统计计算主键和外键,可以推断,影响子查询解相关技术唯一性和引用关系,订购大量加入的,并消除冗余连接。
策划者利用这些重要的关系,但它假定在亚马逊红移表中的所有键都为加载有效。 如果您的应用程序允许无效的外键或主键,一些查询可以返回不正确的结果。 例如,如果主键不是唯一一个SELECT DISTINCT查询可能返回重复的行。 如果你怀疑其有效性不要为你的表定义键约束。 在另一方面,你应该永远当你知道它们是有效申报主键和外键和唯一性约束。
亚马逊红移不强制NOT NULL列约束。
http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html
我使用的身份自动增加我的主键。
这里有一个问题,我问在AWS论坛:
https://forums.aws.amazon.com/message.jspa?messageID=450157#450157