5

我使用以下查询来创建我的表。

create table t1 (url varchar(250) unique);

然后我插入大约 500 个网址,两次。我希望第二次获得没有新条目出现在我的表中的 URL,而是我的计数值加倍:

select count(*) from t1;

我想要的是,当我尝试添加一个已经在我的表中的 url 时,它会被跳过。我是否在我的表减速中声明了一些不正确的东西?

我正在使用 AWS 的 RedShift。

样本

urlenrich=# insert into seed(url, source) select 'http://www.google.com', '1';
INSERT 0 1
urlenrich=# select * from seed;
          url          | wascrawled | source | date_crawled 
-----------------------+------------+--------+--------------
 http://www.google.com |          0 |      1 | 
(1 row)

urlenrich=# insert into seed(url, source) select 'http://www.google.com', '1';
INSERT 0 1
urlenrich=# select * from seed;
          url          | wascrawled | source | date_crawled 
-----------------------+------------+--------+--------------
 http://www.google.com |          0 |      1 | 
 http://www.google.com |          0 |      1 | 
(2 rows)

\d 种子的输出

urlenrich=# \d 种子

                  Table "public.seed"
    Column    |            Type             | Modifiers 
--------------+-----------------------------+-----------
 url          | character varying(250)      | 
 wascrawled   | integer                     | default 0
 source       | integer                     | not null
 date_crawled | timestamp without time zone | 
Indexes:
    "seed_url_key" UNIQUE, btree (url)
4

5 回答 5

12

想通了问题

Amazon RedShift 不强制执行约束...

如此处所述 http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html

他们说他们可能会在某个时候改变它。

新 2013 年 11 月 21 日 RDS 增加了对 PostGres 的支持,如果您需要独特的并且这样的 postgres rds 实例现在是最好的选择。

于 2013-07-19T19:37:23.330 回答
4

在 redshift 中,建议使用约束但不会生效,约束只会帮助查询计划者选择更好的方式来执行查询。

通常,列式数据库不管理索引或约束。

于 2016-01-18T09:32:58.390 回答
1

尽管 Amazon Redshift 不支持唯一约束,但有一些方法可以删除重复记录,这些方法可能会有所帮助。有关详细信息,请参阅以下链接。

将数据从 Amazon s3 复制到 Red Shift 并避免重复行

于 2013-11-21T07:44:43.027 回答
1

在分布式系统中执行主键和唯一键很困难,更不用说列存储系统了。RedShift (Parcel) 和 Vertica 都面临同样的问题。

列存储的挑战在于,被问到的问题是“这个表行在另一个表行中是否有相关条目”,但列存储不是为行操作而设计的。

在 HP Vertica 中,有一个明确的命令可以报告约束违规。在 Redshift 中,您似乎必须自己动手。

    SELECT COUNT(*) AS TotalRecords, COUNT(DISTINCT {your PK_Column}) AS UniqueRecords
    FROM {Your table}
    HAVING COUNT(*)> COUNT(DISTINCT {your PK_Column}) 

显然,如果你有一个多栏PK你必须做一些更重量级的事情。

SELECT COUNT(*)
FROM (
    SELECT {PkColumns}
    FROM {Your Table}
    GROUP BY {PKColumns}
    HAVING COUNT(*)>1

) AS DT

如果上面返回的值大于零,则说明您违反了主键。

于 2016-10-13T11:56:09.457 回答
-2

对于任何人:

  • 需要使用红移
  • 想要在单个查询中插入唯一的
  • 不太关心查询性能
  • 只真正关心一次插入一个唯一值

这是完成它的简单方法

INSERT INTO MY_TABLE (MY_COLUMNS) 
    SELECT MY_UNIQUE_VALUE WHERE MY_UNIQUE_VALUE NOT IN (
        SELECT MY_UNIQUE_VALUE FROM MY_TABLE 
        WHERE MY_UNIQUE_COLUMN = MY_UNIQUE_VALUE
    )
于 2015-02-12T20:29:44.543 回答