2012-10-17 42 views
1

有没有一种方法可以删除基于列名的约束?Postgres删除列名限制

我有postgres 8.4,当我升级我的项目升级失败,因为约束被命名不同的版本不同。

基本上,我需要删除一个约束,如果它存在或我可以删除约束使用列名称。

约束的名称是唯一已更改的。任何想法,如果这是可能的?

在这种情况下,我需要删除“patron_username_key”

discovery=# \d patron 
         Table "public.patron" 
      Column   |   Type    | Modifiers 
--------------------------+-----------------------------+----------- 
patron_id    | integer      | not null 
create_date    | timestamp without time zone | not null 
row_version    | integer      | not null 
display_name    | character varying(255)  | not null 
username     | character varying(255)  | not null 
authentication_server_id | integer      | 
Indexes: 
    "patron_pkey" PRIMARY KEY, btree (patron_id) 
    "patron_username_key" UNIQUE, btree (username, authentication_server_id) 
+0

什么样的约束?外键?检查约束?不是空? –

+0

我编辑了原帖 –

回答

1

假设唯一索引是加入了独特的约束的结果,你可以使用下面的SQL语句删除约束:

do $$ 
declare 
    cons_name text; 
begin 
    select constraint_name 
    into cons_name 
    from information_schema.constraint_column_usage 
    where constraint_schema = current_schema() 
    and column_name in ('authentication_server_id', 'username') 
    and table_name = 'patron' 
    group by constraint_name 
    having count(*) = 2; 

    execute 'alter table patron drop constraint '||cons_name; 
end; 
$$ 

我不知道,如果你有“只这将工作“添加了一个唯一的索引(而不是唯一的约束)。

如果您需要对2列以上的数据执行此操作,则还需要调整having count(*) = 2部件以匹配column_name in ..条件中的列数。

(因为你没有指定你的PostgreSQL版本,我假设当前版本)

1

您可以使用System Catalogs找到回合约束。尽管如此,在单独的pg_constraint表中提到了一些约束,如密钥,而其他约束如NOT NULL基本上是pg_attribute表中的列。

对于按键,您可以使用此查询来获取的约束定义的列表:

SELECT pg_get_constraintdef(c.oid) AS def 
    FROM pg_class t 
    JOIN pg_constraint c ON c.conrelid=t.oid 
WHERE t.relkind='r' AND t.relname = 'table'; 

然后,您可以过滤掉引用您的列的那些和动态构造ALTER TABLE ... DROP CONSTRAINT ...语句。