我想問是否可以在數組列上設置UNIQUE - 我需要檢查數組項是否唯一。其次,我希望也有第二列加入這個。Postgres:唯一的數組和varchar列
想象一下我需要什麼,我將包括一個例子:想象一下,您擁有域和別名的條目。列domain
是varchar
其中有主域,aliases
是array
,它可以是空的。根據邏輯,列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 |
在此先感謝。
在* NOT *定義爲NOT NULL的列上定義的UNIQUE CONSTRAINT不能保證唯一性。 – bma
嗯,謝謝你的好處('域'definitelly應該是NOT NULL),但是,也許我錯過了一些東西,但NULL值從獨特的檢查ommited,不是嗎?我想我在MySQL中使用的是這樣的... – tomis
不,NULL是未知數,所以UNIQUE不能應用於未定義爲NOT NULL的列。我已經制作了一個簡單的[SQL小提琴](http://sqlfiddle.com/#!12/22c39/5)來演示這一點。 要使該列可以爲空,但仍具有UNIQUE約束,您需要將可空列置爲一個值。例如。 'COALESCE(domain,'xyz')' – bma