postgresql中的唯一约束问题

时间:2016-01-23 09:52:43

标签: postgresql apache-storm

在postgres中,我创建了一个名为twitter_tweets的表。在此表中,我使用命令

为tweet_text列分配了约束
ALTER TABLE ONLY twitter_tweets
ADD CONSTRAINT twitter_tweets_pkey PRIMARY KEY (tweet_text);

通过获取消息(即alter table

)来应用约束

但在解析显示运行时异常的数据时,即

  

了java.lang.RuntimeException:未能执行插入查询插入到twitter_tweets(tweet_created_at,tweet_id,tweet_id_str,tweet_text,tweet_source,tweet_truncated,tweet_in_reply_to_status_id,tweet_in_reply_to_status_id_str,tweet_in_reply_to_user_id,tweet_in_reply_to_user_id_str,tweet_in_reply_to_screen_name,tweet_geo,tweet_coordinates,tweet_at_reply,tweet_is_quote_status,tweet_retweet_count, tweet_favorite_count,tweet_favorited,tweet_retweeted,tweet_lang,tweet_possibly_sensitive,tweet_filter_level,tweet_scopes_S)值(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,在Demo.JdbcClient.executeInsertQuery(JdbcClient.java:62)在Demo.PsqlBolt.execute(PsqlBolt.java:91)在backtype.storm.daemon.executor $ fn__5694 $ tuple_action_fn__5696?) .invoke(executor.clj:690)at backtype.storm.daemon.executor $ mk_task_receiver $ fn__5615.invoke(executor.clj:436)at backtype.storm.disruptor $ clojure_handler $ reify__5189.onEvent(disruptor.clj:58)at at backtype.storm.utils.DisruptorQueue.consu meBatchToCursor(DisruptorQueue.java:132)attypetype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:106)at backtype.storm.disruptor $ consume_batch_when_available.invoke(disruptor.clj:80)at backtype.storm.daemon.executor $ fn__5694 $ fn__5707 $ fn__5758.invoke(executor.clj:819)at backtype.storm.util $ async_loop $ fn__545.invoke(util.clj:479)at clojure.lang.AFn.run(AFn.java:22)at java.lang.Thread.run(Thread.java:745)引起:org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“twitter_tweets_pkey”详细信息:Key(tweet_text)=()已存在。在org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198)在org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1927)在org.postgresql.core.v3.QueryExecutorImpl.execute (QueryExecutorImpl.java:405)在org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2892)在com.zaxxer.hikari.proxy.StatementProxy.executeBatch(StatementProxy.java:116)在com.zaxxer.hikari。 Demo.JdbcClient.executeInsertQuery(JdbcClient.java:50)中的proxy.PreparedStatementJavassistProxy.executeBatch(PreparedStatementJavassistProxy.java)... 11更多

下面的image1是我使用约束twitter_tweets table

的表

这是保留约束I got only one field data but not all the fields

后的输出

2 个答案:

答案 0 :(得分:1)

此处描述了您的问题:

  

错误:重复键值违反了唯一约束" twitter_tweets_pkey"细节:Key(tweet_text)=()已经存在。在

您将tweet_text设置为PRIMARY KEY(PK),而PK则无法获得重复数据。

在某些时候,您已经将要尝试插入的数据插入此列(tweet_text)。

现在,为什么不创建一个Integer列,AUTO INCREMENTED,类似于ID?就像现在这样,你告诉我没有人应该发布由其他用户发布的相同文本。

实施例。如果用户A发布包含内容(tweet_text)的推文:" Hello World",则其他任何用户都无法发布相同的内容。

答案 1 :(得分:0)

唯一约束违规

您要求输入主键。 Postgres中的主键自动创建索引和UNIQUE约束。

然后插入了数据行。这些行中至少有两行在主键字段中具有相同的值。重复数据违反了UNIQUE约束。 Postgres然后在拒绝存储违规数据时履行了职责。作为异常,这个拒绝报告给你,Java程序员。

根据错误文本中间的摘录,至少这是我的猜测:

  

引起:org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“twitter_tweets_pkey”详细信息:Key(tweet_text)=()已存在。