pgsql에서 unique index 관련 오류

권순선의 이미지

http://kldp.net 업그레이드 과정에서 다음과 같은 오류가 발생합니다.
ERROR: Cannot create unique index. Table contains non-unique values 이 부분이 핵심내용 같고, 뭔가 값이 중복되어 있는 것 같은데 어떻게 찾을 수 있을지, 정확한 의미는 무엇인지...아무튼 어떤 힌트라도 좋으니 부탁드립니다....

Quote:
Upgrading your database scheme from 2.5
DBD::Pg::st execute failed: ERROR: Cannot create unique index. Table contains non-unique values at /usr/lib/gforge/bin/db-upgrade.pl line 428. Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: Cannot create unique index. Table contains non-unique values at /usr/lib/gforge/bin/db-upgrade.pl line 428.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42 Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: Cannot create unique index. Table contains non-unique values at /usr/lib/gforge/bin/db-upgrade.pl line 428.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42 Last SQL query was: CREATE UNIQUE INDEX usergroup_uniq_groupid_userid ON user_group(group_id,user_id); (end of query)
Your database schema is at version 2.5.9999.1+temp+data+dropped Please report this bug on the Debian bug-tracking system. Please include the previous messages as well to help debugging. You should not worry too much about this, your DB is still in a consistent state and should be usable.
eminency의 이미지

짧은 소견으로 말씀드리자면...

업그레이드 이전에는 unique index가 걸려 있지 않았던 거 같은데 업그레이드 과정에서 index를 걸다보니 해당 컬럼에서 중복된 값이 발견된 것 같습니다.

아마 db-upgrade.pl 펄 소스 안에 create index SQL문이 있는 거 같은데 인덱스 대상 컬럼을 찾아서 직접 DB에서 중복되는 레코드를 찾아 지워주거나 중복되지않게 컬럼 업데이트를 해야 될 것 같네요.

중복된 값을 찾는 SQL문은 테이블이 table이고 해당 컬럼이 cc라면...

select cc, count(cc) from table group by cc having count(cc) >= 2

정도로 입력하시면 중복되는 값과 중복 횟수를 각각 출력할 것입니다.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

progcom의 이미지

Quote:
CREATE UNIQUE INDEX usergroup_uniq_groupid_userid ON user_group(group_id,user_id);

에러가 난 쿼리문 출력이 있네요.
group_id, user_id에 대한 UNIQUE INDEX 생성 실패입니다.
User_group테이블에서 group_id와 user_id에 존재하는 중복값을 제거해줘야합니다.
(user_id에 group_id가 할당이 되어있는게 아닐까 싶은 생각도 드는데... 그런식이라면 쿼리 자체가 조금 이상하다는 느낌이네요)

권순선의 이미지

ok...많은 조언 감사합니다. 제가 mysql만 사용하다 보니 pgsql은 마치 코끼리가 장님 만지듯이 제대로 그림을 보지 못하고 더듬거리기만 하고 있네요. 중복된 user_id, group_id를 찾아야 한다는 얘기는 어젯밤에도 들었고요. 구체적으로 그것을 "어떻게" 찾아서 "어떻게" 지워야 하는지 잘 모르겠네요.

아래는 pgsql을 실행해서 gforge라는 database를 다루는 부분입니다. select를 아무리 해 봐도 화면상에 아무것도 나오지를 않네요. 죄송하지만 중복되는 부분을 "어떻게" 찾아서 "어떻게" 지우는지 좀더 자세한 설명 부탁드립니다.

감사합니다....

Quote:
gforge-# \d user_group
Table "user_group"
Column | Type | Modifiers
---------------+---------------+-----------------------------------------------------
user_group_id | integer | not null default nextval('user_group_pk_seq'::text)
user_id | integer | not null default '0'
group_id | integer | not null default '0'
admin_flags | character(16) | not null default ''
bug_flags | integer | not null default '0'
forum_flags | integer | not null default '0'
project_flags | integer | not null default '2'
patch_flags | integer | not null default '1'
support_flags | integer | not null default '1'
doc_flags | integer | not null default '0'
cvs_flags | integer | not null default '1'
member_role | integer | not null default '100'
release_flags | integer | not null default '0'
Indexes: admin_flags_idx,
bug_flags_idx,
forum_flags_idx,
project_flags_idx,
user_group_group_id,
user_group_user_id
Primary key: user_group_pkey
Triggers: RI_ConstraintTrigger_11891411,
RI_ConstraintTrigger_11891417

gforge-# select user_id, count(user_id) from user_group group by user_id having count(user_id) >=2
gforge-# select user_id, count(user_id) from user_group
gforge-# select user_id, count(user_id) from user_group
gforge-# select user_id from user_group
gforge-# select * from user_group
gforge-#

dsh의 이미지

혹시 ; 을 빼먹으신건 아니지요?

eminency의 이미지

아무것도 안 나온다는게... 위의 쿼리를 실행하셨을 때 말씀하신 건가요...?
저게 실행했던 그대로 붙이신 거라면...
SQL문 뒤에 ';'를 안 붙이셔서 그런 것 같거든요...-_-

제 pgsql의 프롬프트는 이렇습니다.
eminency=>
그런데 ';'를 붙이지 않고 엔터를 치면 다음과 같이 바뀌는데..
eminency->
MySQL의 '->' 프롬프트처럼 멀티라인 입력을 받는 것인데 제가 보기엔 아마 그래서 아무것도 출력이 되지 않는 것 같거든요.

인덱스 대상 컬럼이 두개이니 다음 SQL로 테스트 해보시기 바랍니다.

select user_id,group_id, count(user_id) from user_group 
group by user_id, group_id having count(user_id)>=2;

두 번 이상 출현하는 user_id, group_id의 페어를 찾는 SQL입니다.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

권순선의 이미지

아 그렇군요. 8)

gforge라는 db에 대해서 수행해 보니 다음과 같은 결과가 나왔고요.

Quote:
gforge=# select user_id,group_id, count(user_id) from user_group
gforge-# group by user_id, group_id having count(user_id)>=2;
user_id | group_id | count
---------+----------+-------
4286 | 189 | 3
(1 row)

sourceforge라는 db에 대해서도 마찬가지 결과가 나왔네요.

Quote:
sourceforge=# select user_id,group_id, count(user_id) from user_group
sourceforge-# group by user_id, group_id having count(user_id)>=2;
user_id | group_id | count
---------+----------+-------
4286 | 189 | 3
(1 row)

그럼 이제 어떻게 해야 하는지요?
dsh의 이미지

Quote:
select user_group_id from user_group
where user_id = '4286'
and group_id = '189'

로 pk 인 user_group_id 값을 확인하시고
하나만 두고 지우시거나 user_id, group_id 값을 바꿔주면 되지 않을까 싶은데요?
권순선의 이미지

user_id에 관련된 문제는 해결이 된 것 같습니다. 도움주신 분들께 대단히 감사드립니다. 그런데 이제는 또다른 문제가 나타났군요. 기존에 에러가 발생했던 부분 이후에 수행되는 부분에서 나타난 에러로 보입니다.

Quote:
ERROR: docdata_docgroupid referential integrity violation - key referenced from doc_data not found in doc_groups at /usr/lib/gforge/bin/db-upgrade.pl line 1016.

의 의미가 무엇인지, 어떻게 해결해야 하는지 좀 알려 주시면 대단히 감사드리겠습니다.

Quote:
kldp:/var/lib/gforge# /var/lib/dpkg/info/gforge-db-postgresql.postinst configure
Configuring for PostgreSQL 7.2
You'll see some debugging info during this installation.
Do not worry unless told otherwise.
Upgrading your database scheme from 2.5
Updating debian_meta_data table.
Committing.
Transcoding the artifact data fields
Updating debian_meta_data table.
Committing.
Inserting missing groups
Updating debian_meta_data table.
Committing.
Database has successfully been converted.
Updating debian_meta_data table.
Committing.
Updating permissions on system groups.
Updating debian_meta_data table.
Committing.
Creating table group_cvs_history.
Updating debian_meta_data table.
Committing.
Registering Savannah themes.
Updating debian_meta_data table.
Committing.
Registering yet another Savannah theme.
Updating debian_meta_data table.
Committing.
Updating language codes.
Updating debian_meta_data table.
Committing.
Fixing artifact-related views.
Updating debian_meta_data table.
Committing.
Adding integrity constraints between the Trove map tables.
Updating debian_meta_data table.
Committing.
Adding extra fields to the groups table.
Updating debian_meta_data table.
Committing.
Updating supported_languages table.
Updating debian_meta_data table.
Committing.
Adding tables for the plugin subsystem.
Updating debian_meta_data table.
Committing.
Upgrading with 20021125.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+12.
Upgrading with 20021212.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+13.
Upgrading with 20021213.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+14.
Transcoding documentation data fields
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+15.
Upgrading with 20021214.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+16.
Upgrading with 20021215.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+17.
Upgrading with 20021216.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+18.
Upgrading with 20021223.sql
Updating debian_meta_data table.
Committing 2.6-0+checkpoint+19.
Upgrading with 20030102.sql
DBD::Pg::st execute failed: ERROR: docdata_docgroupid referential integrity violation - key referenced from doc_data not found in doc_groups at /usr/lib/gforge/bin/db-upgrade.pl line 1016.
Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: docdata_docgroupid referential integrity violation - key referenced from doc_data not found in doc_groups at /usr/lib/gforge/bin/db-upgrade.pl line 1016.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42
Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: docdata_docgroupid referential integrity violation - key referenced from doc_data not found in doc_groups at /usr/lib/gforge/bin/db-upgrade.pl line 1016.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42
Last SQL query was:
ALTER TABLE doc_data ADD CONSTRAINT docdata_docgroupid FOREIGN KEY (doc_group) REFERENCES doc_groups(doc_group);
(end of query)
Your database schema is at version 2.6-0+checkpoint+19
Please report this bug on the Debian bug-tracking system.
Please include the previous messages as well to help debugging.
You should not worry too much about this,
your DB is still in a consistent state and should be usable.
dsh의 이미지

foreign key 참조 에러네요.
doc_data의 doc_group 값이 doc_groups 테이블에
없어서 에러가 나는건데,

Quote:

select doc_group from doc_data
where doc_group not in (
select doc_group from doc_groups
);

로 doc_groups 에 없는 doc_group 값 확인하시고
doc_groups 에 데이터를 넣어주면 되지 않을까 싶습니다. ^^;
(자신감 부족;;;)
권순선의 이미지

앞에 말씀드렸던 모든 문제들은 해결이 되었는데 또다른 에러가 발생하였네요. 8)

Quote:
kldp:/var/lib/gforge# /var/lib/dpkg/info/gforge-db-postgresql.postinst configure
Configuring for PostgreSQL 7.2
You'll see some debugging info during this installation.
Do not worry unless told otherwise.
Upgrading your database scheme from 2.5
DBD::Pg::st execute failed: ERROR: user_group_group_id_fk referential integrity violation - key referenced from user_group not found in groups at /usr/lib/gforge/bin/db-upgrade.pl line 428.
Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: user_group_group_id_fk referential integrity violation - key referenced from user_group not found in groups at /usr/lib/gforge/bin/db-upgrade.pl line 428.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42
Transaction aborted because Uncaught exception from user code:
DBD::Pg::st execute failed: ERROR: user_group_group_id_fk referential integrity violation - key referenced from user_group not found in groups at /usr/lib/gforge/bin/db-upgrade.pl line 428.
eval {...} called at /usr/lib/gforge/bin/db-upgrade.pl line 42
Last SQL query was:
UPDATE user_group SET artifact_flags=0;
(end of query)
Your database schema is at version 2.5.9999.1+temp+data+dropped
Please report this bug on the Debian bug-tracking system.
Please include the previous messages as well to help debugging.
You should not worry too much about this,
your DB is still in a consistent state and should be usable.
kldp:/var/lib/gforge#

에러가 하나 나올때마다 참 마음이 새롭습니다. :? 혹시 해결 방법을 아시는 분이 계시면 도움 부탁드립니다....
권순선의 이미지

아 그러고 보니 앞의 에러와 유형이 거의 비슷하군요. 정신이 없다 보니 자세히 비교를 안했네요.

앞의 에러 해결 방법을 참고해서 한번 쿼리를 날려 봐야겠군요. :o

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.