无法在PostgreSQL中插入具有主键约束的字段

时间:2015-05-30 17:04:18

标签: sql postgresql constraints

我有一个“原始”表,看起来像这样(在其他很多字段中):

 team_id |        team_name        
---------+-------------------------
       1 | Team1
       1 | Team1
       2 | Team2
       2 | Team2

我想提取团队名称及其ID代码,并为他们创建另一个表,所以我创建了:

    CREATE TABLE teams (
        team_id integer NOT NULL,
        team_name varchar(50) NOT NULL,
        CONSTRAINT team_pkey PRIMARY KEY (team_id)
);

我打算将旧表中的数据复制到最近创建的数据中:

INSERT INTO teams(team_id,team_name)                                        
SELECT team_id,team_name FROM rawtable 
GROUP BY team_id, team_name; 

起初我没有添加GROUP BY部分,我收到了一条消息:

ERROR:  duplicate key value violates unique constraint "team_pkey"

我添加了GROUP BY,因此它不会尝试为同一个团队插入多行,但问题仍然存在,并且我不断收到相同的消息。

我不明白是什么导致它。看起来我正在将单个非重复行插入表中。解决这个问题的最佳方法是什么?

5 个答案:

答案 0 :(得分:1)

我最好的猜测是,你至少在桌面的某个地方拥有一个team_id,而不是一个team_name。尝试在你的select语句中添加`count count(*)= 1

答案 1 :(得分:1)

如果具有相同ID的两个不同的团队位于2015 | a | alpha 2014 | a | charlie 2012 | a | bravo 2011 | b | delta ,例如raw_table(1, 'foo') (1, 'bar')仍然会返回两者,因为这两个 不同。

如果您只想为group by的重复值选择一行,那么您应该使用以下内容:

team_id

Postgres特定的insert into teams (team_id,team_name) select distinct on (team_id) team_id, team_name from rawtable order by team_id; 运算符将确保仅返回distinct on的不同值。

答案 2 :(得分:1)

由于team_id在目标表中是唯一的,因此具有相同ID的两个单独的团队名称将创建重复项,每个名称一行。

一个简单的解决方法是按team_id分组,这样你每个id只能获得一行,并选择团队中的一个名称(这里我们有点随意使用MAX来按字母顺序排列最后一行)

INSERT INTO teams(team_id,team_name)                                        
 SELECT team_id, MAX(team_name) FROM rawtable 
 GROUP BY team_id

答案 3 :(得分:0)

尝试在查询中使用distinct:

  

插入团队(team_id,team_name)选择distinct on(team_id)   team_id,team_name来自team_id的订单;

答案 4 :(得分:0)

您的Team1或Team2之一可能有一些额外的空格或不可打印的字符。这会导致您的group by为Team_ID 1或2返回多行导致问题。