2013-07-13 31 views
1

我想問是否可以在數組列上設置UNIQUE - 我需要檢查數組項是否唯一。其次,我希望也有第二列加入這個。Postgres:唯一的數組和varchar列

想象一下我需要什麼,我將包括一個例子:想象一下,您擁有域和別名的條目。列domainvarchar其中有主域,aliasesarray,它可以是空的。根據邏輯,列domain中的任何內容都可以在aliases以及正確的對面。

如果有任何選擇如何做,我會很高興展示如何。最好的做法是在sqlalchemy(表格聲明,在TurboGears中使用)中包含幫助。

  • PostgreSQL的:9.2
  • SQLAlchemy的:0.7

UPDATE:

我已經找到了,怎麼辦多列在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') 
) 

Then desc:

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) 

和select(測試插入後):

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 *定義爲NOT NULL的列上定義的UNIQUE CONSTRAINT不能保證唯一性。 – bma

+0

嗯,謝謝你的好處('域'definitelly應該是NOT NULL),但是,也許我錯過了一些東西,但NULL值從獨特的檢查ommited,不是嗎?我想我在MySQL中使用的是這樣的... – tomis

+0

不,NULL是未知數,所以UNIQUE不能應用於未定義爲NOT NULL的列。我已經制作了一個簡單的[SQL小提琴](http://sqlfiddle.com/#!12/22c39/5)來演示這一點。 要使該列可以爲空,但仍具有UNIQUE約束,您需要將可空列置爲一個值。例如。 'COALESCE(domain,'xyz')' – bma

回答

1

弄清楚如何在純Postgresql語法中完成此操作,然後使用DDL準確發出它。

+0

謝謝你的問題的第二部分,將是有益的。但是,我不知道如何在postgres中完成它... – tomis