2013-07-13 4 views
1

배열 열에 UNIQUE를 설정할 수 있는지 묻고 싶습니다. 배열 항목이 고유한지 확인해야합니다.Postgres : 배열 및 varchar 열에 대한 고유

둘째, 두 번째 항목도 포함 시키길 원합니다.

내가 필요한 것을 상상해 보려면 예제를 포함합니다. 상상해보십시오. 도메인과 별칭이있는 항목이 있다고 가정합니다. 열 domainvarchar이고 주 도메인은 aliasesarray이며 비어있을 수 있습니다. 논리적 인 경우 domain 열은 aliases에있을 수 있으며 그 반대의 경우도 있습니다.

어떻게 할 수있는 옵션이 있다면, 나는 어떻게 보여 주 었는지 기뻐할 것입니다. 그리고 가장 좋은 방법은 sqlalchemy (TurboGears에서 사용하는 테이블 선언)에서이를 수행하는 방법을 포함하는 것입니다.

  • PostgreSQL을 9.2
  • SQLAlchemy의 0.7

업데이트 : 내가 찾은

, SQLAlchemy의 독특한 다중 열을 수행하는 방법, 그러나 그것은 배열에서 작동하지 않습니다 :

client_table = Table('client', metadata, 
    Column('id', types.Integer, autoincrement = True, primary_key = True), 
    Column('name', types.String), 
    Column('domain', types.String), 
    Column('alias', postgresql.ARRAY(types.String)), 
    UniqueConstraint('domain', 'alias', name = 'domains') 
) 

그런 다음 내림차순 :

wb=# \d+ client 
              Table "public.client" 
Column |  Type   |      Modifiers      | Storage | Description 
--------+---------------------+-----------------------------------------------------+----------+------------- 
id  | integer    | not null default nextval('client_id_seq'::regclass) | plain | 
name | character varying |              | extended | 
domain | character varying | not null           | extended | 
alias | character varying[] |              | extended | 
Indexes: 
    "client_pkey" PRIMARY KEY, btree (id) 
    "domains" UNIQUE CONSTRAINT, btree (domain, alias) 

그리고 선택 (테스트 삽입 후) : 사전에

wb=# select * from client; 
id | name | domain  |   alias   
----+-------+---------------+-------------------------- 
    1 | test1 | www.test.com | {www.test1.com,test.com} 
    2 | test2 | www.test1.com | 
    3 | test3 | www.test.com | 

감사합니다.

+0

NOT NULL로 정의되지 않은 열에 대해 정의 된 UNIQUE CONSTRAINT는 고유성을 보장 할 수 없습니다. – bma

+0

흠, 좋은 점을 주셔서 감사합니다. ('domain' definitelly는 NOT NULL이되어야합니다.) 그러나 뭔가를 놓친 것일 수 있습니다. 그러나 NULL 값은 고유 한 검사에서 제외됩니다. 그렇지 않습니까? MySQL에서 이와 비슷한 것을 사용하고 있다고 생각합니다 ... – tomis

+0

아니요, NULL은 알 수 없으므로 UNIQUE를 NOT NULL로 정의되지 않은 열에 적용 할 수 없습니다. 이것을 보여주기 위해 간단한 [SQL Fiddle] (http://sqlfiddle.com/#!12/22c39/5)을 작성했습니다. 열을 Null 허용 할 수 있지만 여전히 UNIQUE 제약 조건이있는 경우 Nullable 열을 값으로 COALESCE해야합니다. 예 : 'COALESCE (domain, 'xyz')' – bma

답변

1

순수 postgresql 구문에서이 작업을 수행하는 방법을 파악한 다음 DDL을 사용하여 정확하게 출력하십시오.

+0

질문의 두 번째 부분을 고맙다, 유용 할 것이다. . 그러나, 나는이 모든 것을 포스트그레스에서하는 방법을 모른다. – tomis

관련 문제