我有一个“原始”表,看起来像这样(在其他很多字段中):
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
,因此它不会尝试为同一个团队插入多行,但问题仍然存在,并且我不断收到相同的消息。
我不明白是什么导致它。看起来我正在将单个非重复行插入表中。解决这个问题的最佳方法是什么?
答案 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返回多行导致问题。