배열 열에 UNIQUE를 설정할 수 있는지 묻고 싶습니다. 배열 항목이 고유한지 확인해야합니다.Postgres : 배열 및 varchar 열에 대한 고유
둘째, 두 번째 항목도 포함 시키길 원합니다.
내가 필요한 것을 상상해 보려면 예제를 포함합니다. 상상해보십시오. 도메인과 별칭이있는 항목이 있다고 가정합니다. 열 domain
은 varchar
이고 주 도메인은 aliases
은 array
이며 비어있을 수 있습니다. 논리적 인 경우 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 |
감사합니다.
NOT NULL로 정의되지 않은 열에 대해 정의 된 UNIQUE CONSTRAINT는 고유성을 보장 할 수 없습니다. – bma
흠, 좋은 점을 주셔서 감사합니다. ('domain' definitelly는 NOT NULL이되어야합니다.) 그러나 뭔가를 놓친 것일 수 있습니다. 그러나 NULL 값은 고유 한 검사에서 제외됩니다. 그렇지 않습니까? MySQL에서 이와 비슷한 것을 사용하고 있다고 생각합니다 ... – tomis
아니요, NULL은 알 수 없으므로 UNIQUE를 NOT NULL로 정의되지 않은 열에 적용 할 수 없습니다. 이것을 보여주기 위해 간단한 [SQL Fiddle] (http://sqlfiddle.com/#!12/22c39/5)을 작성했습니다. 열을 Null 허용 할 수 있지만 여전히 UNIQUE 제약 조건이있는 경우 Nullable 열을 값으로 COALESCE해야합니다. 예 : 'COALESCE (domain, 'xyz')' – bma