Sae*_*ven 18 sql amazon-web-services amazon-redshift
刚刚测试了AWS Redshift,并且在插件上发现了一些我希望在关键列中重复失败的重复数据,阅读文档显示主键约束没有"强制执行".
任何人都想出如何防止主键上的重复(按照"传统"期望).
感谢任何Redshift先驱!
我在创建记录时分配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)
如果添加标识列以用作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)
是的,你不能那样做。目前,我认为您应该只插入重复的数据(基本上是重复的键)和额外的时间戳列。因此它将包含该特定行的所有版本,因为更新也是插入,并且在您查询 Redshift 时,请确保选择最新的版本。
| 归档时间: |
|
| 查看次数: |
12490 次 |
| 最近记录: |